mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik FEHLER unsigned char defused(unsigned int*_last_ids[0])


Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PIC HITECH C: ungültige Dimension
lässt sich also nicht kompilieren

unsigned char defused(unsigned int*_last_ids[0])
{
  //fkt. durchsucht alle 4 Elemente von ....[4] also eindim. array
}



(als Test: DevC++ als C-Konsolenanwendung wird einwandfrei kompiliert)
muss ich je nach Kompiler den Parameter anders gestalten? Vllt 
ausweichen auf ein global angelegtes array um die Pointergeschichte 
wegzumachen?

bin Ratlos!

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du definierst als Übergabe einen Pointer auf ein Array der Größe 0.  Das 
ist sinnlos.  Formuliere mal aus, was Du übergeben bekommen willst.

Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich will der fkt. ein komplettes array zur verfügung geben

irgendwie kann ich mich an den füheren info-unterricht erinnern, dass 
ein pointer auf die "nullte stelle" ausreicht, um auf das komplette 
array zugreifen zu könnne. Abhilfe habe ich nun durch bit defused 
(unsignet int*_last_ids[4]) bekommen.

Ist ja auch klar, hier muss ich wohl einen lokalen pointer auf ein array 
der größe geben, die ich der fkt. auch übermittel.

wie kann ich jedoch die fkt. für verschieden große arrays funktionsfähig 
machen? ich könnte das größte array als maß zur erzeugung der fkt. 
angeben.

ABER: ich weiß vorher nicht, wie gr. die arrays werden, weil sie vllt. 
dyn. erzeugt werden... und NUN?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timo P schrieb:

> irgendwie kann ich mich an den füheren info-unterricht erinnern, dass
> ein pointer auf die "nullte stelle" ausreicht, um auf das komplette
> array zugreifen zu könnne. Abhilfe habe ich nun durch bit defused
> (unsignet int*_last_ids[4]) bekommen.

Deine Erinnerungen sind etwas verworren.

In C wird ein Array grundsätzlich dadurch übergeben, dass die Adresse 
des ersten Array elements übergeben wird.
Die Funktion muss also diese Adresse in einem Pointer auffangen

unsigned char defused( unsigned int* _last_ids )
{
  arbeite mit last_ids[0]
  arbeite mit last_ids[1]

  ...
}


int foo()
{
  unsigned int Array[5];

  defused( Array );
}

> ABER: ich weiß vorher nicht, wie gr. die arrays werden, weil sie vllt.
> dyn. erzeugt werden... und NUN?

Dann must du dir bei der Erzeugung merken, wie groß du sie erzeugt hast 
und diese Information mit an die Funktion übergeben.

Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist ja bei dieser lösung nicht so schlimm

Karl heinz Buchegger schrieb:
> Dann must du dir bei der Erzeugung merken, wie groß du sie erzeugt hast
> und diese Information mit an die Funktion übergeben.

ist ja nicht so schlimm bei dieser lösung! Danke für die Aufklärung. 
Also nehm ich nen "einfachen pointer" auf die 0te stelle.

so kann ich innerh. der fkt. sizeof(_last_ids) nutzen richitg=

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timo P schrieb:
> so kann ich innerh. der fkt. sizeof(_last_ids) nutzen richitg=

Nein, kannst du nicht. Sizeof liefert dir die Größe des Pointers, nicht 
die Größe des Arrays.

Du musst die Größe auf irgendeine Art mit in die Funktion geben. Z.B. 
als zusätzlichen Parameter, oder indem du das Array terminierst.

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In C gibt es keinen Arrays! Das ist alles nur etwas syntax sugar für 
Pointerarithmetik. Daher kann muss man auch immer die Größe des "Arrays" 
separat übergeben. Wenn du in der Funktion nun nen sizeof(_last_ids) 
machst, erhältst du nicht die Größe des "Arrays", sondern die Größe 
eines Pointers auf deinen Prozessor. Das wurde hier schon mal 
diskutiert:
Beitrag "Anzahl der Arrayelemente in einer Funktion ermitteln"

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.