Zugriff auf Array merkwürdig
-
JJR schrieb:
Code beispielhaft mal dazu:
zeig mal den originalcode. irgendwas abgetipptes hilft nix.
-
Was du sagst, stimmt nicht. Ich hab mal ein Beispiel gebastelt:
void speichern(char quelle,char *ziel) { *ziel=quelle; } int main(void) { char array[100]; char quelle='x'; int z=0; speichern(quelle,&array[z]); }
Klappt wunderbar. Und fricky hat Recht, poste per C&P deinen Originalcode. Du hast ja beim Abtippen sogar ein Semikolon vergessen ;), ganz abgesehen davon, dass man nunmal nicht sieht welchen Typ und Wert deine Variablen haben...
P.S.: Ich hoffe, in deiner Funktion passiert noch mehr. So hätte das ja wenig Sinn, richtig?
-
ok, tippfehler
aber ich glaube der quellcode hilft hier auch nicht weiter
default: Z=M/2; //Auswahl des AD Channels, Gain, Messbereich... i_APCI3120_InitAnalogInput (pdev_3120, Z, 1, 128, 10, 0); //Starten der Umsetzung i_APCI3120_StartAnalogInput (pdev_3120); //Warten bis Umsetzung fertig while( !i_APCI3120_ReadAnalogInputBit(pdev_3120) ); //Speichern des integerwert in AD[Z] printk("Z %u\n",Z); i_APCI3120_ReadAnalogInputValue (pdev_3120, &DATEN->ADW[Z]); break;
wie gesagt, vor dem letzten Aufruf ist Z auf jeden Fall =0, auch nach dem Aufruf der Funktion, und wenn ich &DATEN->ADW[0] schreibe speichert er auch in [0]
M läuft übrigens von 0..15, entsprechend Z von 0..7
bei initanaloginput wählt Z den Kanal aus
-
Und wieder zeigst du weder die Deklaration (Typ) von beispielsweise Z, noch kann man an dem Ausschnitt selbst nachvollziehen, welcher Wert da denn tatsächlich drinsteht. Denn eines ist sicher, mein obiges Beispiel funktioniert selbstverständlich, und wenn du ein Array mit dem Index 0 ansprichst (egal ob Variable oder Literal), dann wird mit Sicherheit auch an der Position 0 gelesen/geschrieben.
-
ich glaube Dir ja das Dein Beispiel funktioniert, so habe ich es ja selber auch schon immer gemacht, nur jetzt kommt halt dieses Phänomen
ich habe es doch unten drunter geschrieben
Z und M sind integer, M läuft in der case Abfrage von 0..15
es ist auch noch eine Zeile drin von meinen Tests bei denen ich kontrolliert habe was Z für einen Wert hat, und der läuft wie gesagt von 0..7
die 700 Zeilen code jetzt hier zu posten sehe ich keinen Sinn drin (ich will hier nicht den Besserwisser spielen, aber ich sage es nochmal, an dem Codeausschnitt hat M einen Wert zwischen 0..15 (habe ich kontrolliert!) und Z dann entsprechend von 0..7).
Es sollte also funktionieren, tut es aber nicht. array[Z-1] klappt.Muss es wohl an i_APCI3120_ReadAnalogInputValue() liegen
-
Wie hast du das kontrolliert? Per Ausgabe auf dem Bildschirm? Oder per Debugger?
-
_matze schrieb:
Wie hast du das kontrolliert? Per Ausgabe auf dem Bildschirm? Oder per Debugger?
nur auf dem Bildschirm, also mit printk() die Werte von Z.
und halt anzeigen des Messwertes, welche je nach dem in [0] oder [1] gespeichert ist.
debuggen geht ja soweit ich weiß im kernel nicht, aber da ich mit Z ja auch den Messkanal auswähle und ich da weiß welche Spannug ich angelegt habe und diese mit dem gewandelten Wert stimmt kann ich da glaube ich beruhigt sagen das Z das ist was es sein soll (wobei irgendwo ja der Fehler sein muss, ich haber einfach mal ausschließe dass ich der Schuldige bin)
-
Tja, du hast Recht. Irgendwo muss der Fehler ja liegen. Eigentlich können es ja nur zwei Dinge sein:
Entweder Z ist zu dem Zeitpunkt nicht 0 Vielleicht wurde der Wert durch eine andere Funktion zwischenzeitlich geändert. Du kannst dein printk ja auch noch mal nach der Funktion ausgeben.
Oder an der Stelle im Array steht nicht das, was du vermutest. Das halte ich fast für wahrscheinlicher. Gib doch auch mal DATEN->ADW[Z] aus (vor und nach der Funktion). Vielleicht klärt sich die Sache dann.
Ansonsten weiß ich auch nicht weiter. Nur dass du bei korrekter Indexangabe ein falsches Element erhältst, ist wohl ausgeschlossen.
-
so, also ich habe jetzt folgendes gemacht:
switch(Z) und dann bei jedem case halt per Hand die "Zahlen" angegeben. selber Fehler!!
Es liegt daran dass die Analog-Umsetzung zu lange dauert und das ganze daher etwas hinterherhinkt, der code wird also einfach zu schnell abgearbeitet.
war also zumindest zum Teil dann doch mein Fehler
-
Hauptsache, der Fehler ist gefunden und kann gelöst werden!