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
>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.
@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
>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.
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]
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
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...
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 | }
|
> 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.
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
>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!
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.