Forum: Compiler & IDEs Struct Array als Referenz übergeben


von Roman K. (romank)


Lesenswert?

Guten Abend zusammen,

ich habe hier ein Problem das ich ein Array einer struct anlegen muss 
die a) 0 sein kann (ich meine nur 1mal angelegt werden soll, b) einmal 
initialisert werden soll in unterschiedlichen Funktion.

Main.c{
...
...
CARDINIT;
}

(Datei Card.c)

typedef struct {
daten...
date[15]...
} wtbCardSruct;

static wtbCardStrut wtbCard;

SET_DATE {u8 i){
wtbCard.DATE[i] = ....;
}

CARDINIT {
wtbCard.Daten = ...;
SET_DATE(i);

}

Ich offe das mein Problem deutlich geworden ist. Wie zu erwarten ist das 
Array nicht initialisert. Eine Übergabe per & Aufruf habe ich schon mal 
durch geführt, nur mit dem Array[] komm ich nicht klar. Wie gehe ich das 
Ganze korrekt an?


Gruss und Danke

Roman

von Hmm (Gast)


Lesenswert?

>Ich offe das mein Problem deutlich geworden ist.

Offen gesagt, nein!

>Wie zu erwarten ist das Array nicht initialisert.
Aufgrund welcher Annahmen ist das zu erwarten?

In Deinem Post taucht zweimal ein "Array" auf.
Einmal in Deinem Text und einmal in Deinen Codebruchstücken als Element 
der Struktur. Jedoch kein "Array einer struct".

>...einer struct anlegen muss die a) 0 sein kann...
Eine Struktur kann nicht 0 sein. Eine Struktur und ein Integer-Literal 
sind weder in C als Vergleichsoperation noch wenn man über ein C 
Programm in der Umgangssprache der Programmierer spricht, vergleichbar.

Genauso hat der Teilsatz
>einer struct anlegen muss die a) 0 sein kann (ich meine nur 1mal angelegt werden 
soll

keine Bedeutung in Ausdrücken der Sprache C oder in der Sprechweise über 
Programme. Setzt man voraus das 0 ein Literal für eine bestimmtes 
Individuum mit einer in C definierten Struktur ist, dann ist das 
keinesfalls, auch nicht im übertragenen Sinne oder metaphorisch 
identisch damit das eine Struktur nur einmal angelegt wurde.

Ich schlage Dir den Versuch einer sprachlich präziseren Ausdrucksweise 
vor.

von Roman K. (romank)


Lesenswert?

@Hmm: Stimmt die Zeile static wtbCardStrut wtbCard; muesste heissen 
static wtbCardStrut wtbCard[num]; wobei num auch 1 sein kann. Da der 
Index im allgemein von 0 an zaehlt habe ich mich zu der Aeusserung kann 
auch null sein hinreissen lassen. Aber vielleicht geht das Ganze 
deinerseits auch etwas verständlicher.

Gruss

Roman

von Hmm (Gast)


Lesenswert?

>Aber vielleicht geht das Ganze deinerseits auch etwas verständlicher.

Nun, falls Du es wie ich machst und erklärst, was unverständlich war, 
gerne.

Nochmal offen gesagt, entnehme ich den Mängeln Deiner Ausdrucksweise, 
dass Du Dir über bestimmte Dinge nicht klar bist.

1. Was ist eine Struktur? Was bedeutet eine Deklaration? Was bedeutet 
die Deklaration einer Struktur?
2. Was ist ein Literal? Was ist ein Integer-Literal? Was ist ein 
Struktur-Literal?
3. Was ist ein Vergleich? Welche "Dinge" sind vergleichbar? Welche sind 
es nicht?
4. Was ist ein Index? Wieviele Elemente hat ein Array das deklariert 
ist: char array[5]?
5. Was ist der Unterschied zwischen der Aussage "ein Element kann 0 
sein" und "der Array-Index kann 0 sein"?

Etc. pp.

von B. S. (bestucki)


Lesenswert?

Kannst du bitte die C Syntax befolgen (ich nehme an, dass es C sein 
soll), das lesen deines Codes wäre damit wesentlich einfacher. Dein Code 
wird so nicht funktionieren, da meckert jeder Compiler.

Ich weiss jetzt nicht, was genau dein Problem ist. Willst du das gesamte 
struct der Funktion übergeben, oder nur ein Pointer der auf das struct 
zeigt und weisst nicht wie das geht? Oder etwas ganz anderes?

Der Funktion CARDINIT übergibst du keine Werte, wo kommt das i her? Wenn 
du ein Array aus struct machst, musst du in den Funktionen auch auf das 
entsprechende Element zeigen. wtbCard ist nicht gleich wtbCard[0]

von Roman (Gast)


Lesenswert?

Hallo,

nachdem ich gestern die Faxen dicke hate, jetzt nochmal ein neuer 
Versuch.
Ich versuche in C auf einem NXP LPC1769 mit RTOS Betiebssytem eine 
Adresse zu übergeben wie folgt:

in mwvb.c



static midi_waveboard_cards wtbCard[MIDI_WAVEBOARD_CARD_NUM];

function init() {
...
do something
...
MIDI_WAVEBOARD_Card_Reset(&wtbCard[0], k);
...
The result is  that data in the strust[array] are not changed.
}

void MIDI_WAVEBOARD_Card_Reset(midi_waveboard_cards * wtbCard[0],u8 
resCard ) {
...
wtbCrad[resCard]->data = 0;
...
do something
...
return
}

Wenn ich mir per Debug jetzt das Ergebnis des Aufrufes anschaue, stelle 
ich fest das der Wert nicht verändert wurde. Die Fehlermeldung des 
Compilers lautet expected struct is midi_waveboard_cards ** but argument 
is of struct midi_waveboard_cards * . Kann mir jetzt vielleicht jemand 
helfen?

Gruss

Roman

von oto (Gast)


Lesenswert?

Bring' mal Dein Gestammel in Ordnung.

von Ralf G. (ralg)


Lesenswert?

Roman schrieb:
> Wenn ich mir per Debug jetzt das Ergebnis des Aufrufes anschaue, stelle
> ich fest das der Wert nicht verändert wurde. Die Fehlermeldung des
> Compilers lautet expected struct is midi_waveboard_cards ** but argument
> is of struct midi_waveboard_cards * .

Du kannst das Programm debuggen, obwohl der Compiler eine Fehlermeldung 
gebracht hat und damit eigentlich gar kein Programm existieren sollte? 
Ist es vielleicht 'nur' eine Warnung? Dann eine von der Sorte, die man 
unbedingt abstellen sollte!
Wobei mir deine Funktionsdeklarationen etwas komisch vorkommen...

von Fabian O. (xfr)


Lesenswert?

1
static midi_waveboard_cards wtbCard[MIDI_WAVEBOARD_CARD_NUM];
2
3
function init() {
4
  ...
5
  // do something
6
  ...
7
  MIDI_WAVEBOARD_Card_Reset(wtbCard, k);
8
  ...
9
}
10
11
void MIDI_WAVEBOARD_Card_Reset(midi_waveboard_cards* cards, u8 resCard) {
12
  ...
13
  cards[resCard].data = 0;
14
  ...
15
  // do something
16
  ...
17
  return;
18
}

von Hmm (Gast)


Lesenswert?

> nachdem ich gestern die Faxen dicke hate

Die haben wir auch dicke. Du liest nicht was wir schreiben und hast 
offensichtlich nicht mal von den Grundlagen eine Ahnung.
Anstelle dessen probierst Du wild herum ohne eigentlich zu wissen, was 
Du tust.
Willst Du jetzt jeden Abend die Konversation abbrechen um sie dann 
morgens mit der selben Frage neu zu beginnen?

Ich habe zwar das Gefühl Perlen vor die Säue zu werfen aber ich probiere 
es nochmal:

Nutze die C-Tags hier im Forum. Lies ein C-Buch und den Artikel 
"Netiqette" hier links unter Artikeln zu finden.

In
[c]
void MIDI_WAVEBOARD_Card_Reset(midi_waveboard_cards * wtbCard[0],u8
resCard )

ist wtbCard ein Zeiger auf ein Array, also ein Zeiger auf einen Zeiger. 
Das ist genau das was der Compiler mit seiner Fehlermeldung meint.

0. Lies ein C-Buch. Bemühe Dich verständlich zu schreiben.
1. Poste (als Anhang) Code der vollständig complierbar ist. Mach ein 
Minimalbeispiel, dass erstmal das Grundproblem angeht. Einfach eine 
Struktur, ein Array davon und eine Funktion der Du ein Element des 
Arrays übergibst.
2. Beobachtung: Was passiert? Wie erkennst Du das genau? Was hast Du im 
Detail gemacht um die Situation herbeizuführen in der Du das erkannt 
hast?

Ansonsten musst Du halt alleine sehen wie Du klarkommst.

Du hälst das vielleicht für Hochmut aber glaube mir, das ich bei aller 
Überheblichkeit da ansetze, wo ich meine, dass das Problem liegt.
Sprachliche Korrektheit in einem Mindestmaß (Inhalt und 
Folgerichtigkeit) und Wissen über den Problemkreis (C).
Ich habe den Eindruck das Du Dich mit Deinem Vorhaben total übernommen 
hast. Dann musst Du Dir auch gefallen lassen, das man Dich bei der Hand 
nimmt, falls Du Hilfe willst.

von Roman (Gast)


Lesenswert?

Hallo Hmm,

du hast ja recht mit deiner Form der Hilfestellung. Es ist auch eher ein 
Akt der Verzweifelung gewesen der mich zu diesem Gestammel veranlasst 
hat.

Der Fehler lag hier eher im Speicher der leider begrenzt ist. Die 
Initailisierung schlug deshalb fehl. Durch Reduzierung der Datenmenge 
und fleissigen Debugausgaben ist mir das dann aufgefallen. Einen 
Compilerfehler habe ich nicht beschrieben, sondern dass das Ergebnis 
nicht der Erwartung entsprach.

Würdest Du mir bitte einen Rat geben wie ich das mit dem Zeiger auf den 
Zeiger vermeiden kann bzw. den Aufruf mit Übergabe des Zeigers richtig 
gestalte.

Gruss

Roman

von Hmm (Gast)


Lesenswert?

>Würdest Du mir bitte einen Rat geben wie ich das mit dem Zeiger auf den
>Zeiger vermeiden kann bzw. den Aufruf mit Übergabe des Zeigers richtig
>gestalte.

Noch mal den selben Rat? Bitteschön. Lies ein C-Buch!

von Hans Ulli K. (Gast)


Lesenswert?

@Roman
Ich empfehle K&R Programmieren in C

Wenn ich deine Codefragmente richtig verstehe willst du verschiede Midi 
Karten initialisieren.

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.