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


von Timo P (Gast)


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!

von Hc Z. (mizch)


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.

von Timo P (Gast)


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?

von Karl H. (kbuchegg)


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

1
unsigned char defused( unsigned int* _last_ids )
2
{
3
  arbeite mit last_ids[0]
4
  arbeite mit last_ids[1]
5
6
  ...
7
}
8
9
10
int foo()
11
{
12
  unsigned int Array[5];
13
14
  defused( Array );
15
}

> 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.

von Timo P (Gast)


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=

von Stefan E. (sternst)


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.

von Uwe .. (uwegw)


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"

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.