syntax Error in c18
-
Hallo zusammen,
ich habe es folgende zwei Funktionen:void Get_ROM_Content(unsigned char *paucRomContent_p); void Write_Value(char daten1, int daten2[][]);
Was mache ich falsch bei so eine deklaration von
void Write_Value(char daten1, int daten2[][]);
Die beide Funktion sind so implementiert:
void Get_ROM_Content(unsigned char *paucRomContent_p) { char chAdr_l; unsigned char ucRomVal; unsigned char ucMsk_l; unsigned char ucRomRead_l; int Data[4]; // int ADR_DATA[64][4]; // int ROM[8][4]; int i= 0; for (i = 0; i < 64; i++) { if (i % 9 == 0) { Data[0] = 8 ; Data[1] = 4; Data[2] = 2; Data[3] = 1; } else { Data[0] = 0; Data[1] = 0; Data[2] = 0; Data[3] = 0; } ADR_DATA[i][0] = (i << 4) | Data[0]; ADR_DATA[i][1] = (i << 4) | Data[1]; ADR_DATA[i][2] = (i << 4) | Data[2]; ADR_DATA[i][3] = (i << 4) | Data[3]; } UNLOCK = 1; ///////////////////////////////////////////////////////////////// for (i = 0; i < 64; i++) { if (i % 9 == 0) { // RAM loeschen Power On Reset ON_OFF = 0; DELAY100MS ON_OFF = 1; DELAY100MS // RAM gelöscht, D1 aud "1" bei ADR = i ucRomVal = Write_Value(0x7, ADR_DATA[i][0]); if (ucRomVal == 1) { ROM[i][0] = ucRomVal; } // RAM loeschen Power On Reset ON_OFF = 0; DELAY100MS ON_OFF = 1; DELAY100MS // RAM gelöscht, D2 aud "1" bei ADR = i ucRomVal = Write_Value(0x7, ADR_DATA[i][1]); if (ucRomVal == 1) { ROM[i][1] = ucRomVal; } // RAM loeschen Power On Reset ON_OFF = 0; DELAY100MS ON_OFF = 1; DELAY100MS // RAM gelöscht, D3 aud "1" bei ADR = i ucRomVal = Write_Value(0x7, ADR_DATA[i][2]); if (ucRomVal == 1) { ROM[i][2] = ucRomVal; } // RAM loeschen Power On Reset ON_OFF = 0; DELAY100MS ON_OFF = 1; DELAY100MS // RAM gelöscht, D4 aud "1" bei ADR = i ucRomVal = Write_Value(0x7, ADR_DATA[i][3]); if (ucRomVal == 1) { ROM[i][3] = ucRomVal; } } } UNLOCK = 0; //return 0; } void Write_Value(char daten1, int daten2[][]) { int x; // Clock count char Data[10]; // Array holds the bits unsigned char ucRet_l = 0; unsigned char IntConf = INTCON; // Holds the interrupt status INTCON = 0; // Define RA2, RA3, RB4, RD7 and RE1 as outputs // These three bits are the mode bits Data[0] = ((daten1 & 0x04) == 4) ? 1 : 0; Data[1] = ((daten1 & 0x02) == 2) ? 1 : 0; Data[2] = ((daten1 & 0x01) == 1) ? 1 : 0; // These three bits are the address bits Data[3] = ((daten2 & 0x40) == 64) ? 1 : 0; Data[4] = ((daten2 & 0x20) == 32) ? 1 : 0; Data[5] = ((daten2 & 0x10) == 16) ? 1 : 0; // These four bits are the data bits D1 - D4 Data[6] = ((daten2 & 0x08) == 8) ? 1 : 0; Data[7] = ((daten2 & 0x04) == 4) ? 1 : 0; Data[8] = ((daten2 & 0x02) == 2) ? 1 : 0; Data[9] = ((daten2 & 0x01) == 1) ? 1 : 0; V35 = 1; // Programming Voltage is 5V V10 = 0; // No over voltage for changing the outputs to inputs V15 = 0; // No 15V needed // Introducing the programming of the RAM, high voltage pulse START = 1; // generate rising high voltage pulse, means V10 = 1 DELAY1MS; // 1 ms - Wait until the START Signal has reached its maximum value of > 10.5V A2_OUT(); // CLOCK, Make LATAbits.LATA2 of PIC to output, to write to AISC A3_OUT(); // DATA, Make LATAbits.LATA3 of PIC to output, to write to AISC DATA = 0; // set data 0, at the beginning msut be zero CLK = 0; // set clock 0, at the beginning msut be zero START = 0; // generate falling edge high voltage pulse, V10 = 0, ASIC Voltage is 5V again DELAY1K; // 84.4 us - short delay // Output 10 bits content of the Array into seriell DATA line for(x = 0; x < 10; x++) { if (Data[x] == 1) {DATA = 1;} else {DATA = 0;} // Falling edge of the clock must be in middle of the DATA CLK = 1; DELAY100; // 8.55 us CLK = 0; DELAY100; // 8.55 us, The period of clk is 17.1 us } DATA = 0; // RAM_LOAD, 11th pulse CLK = 1; DELAY100; // 8.55 us CLK = 0; DELAY100; // 8.55 us // END, 12th pulse CLK = 1; DELAY100; // 8.55 us CLK = 0; DELAY100; // 8.55 us // End of ASIC programming, Changing the outputs to inputs A3_IN(); A2_IN(); DELAY10K; ucRet_l = ROM_READ; V35 = 1; // Programming Voltage is 5V V10 = 0; V15 = 0; INTCON = IntConf; // interrupts status loading //return ucRet_l; }
Danke
-
Was sollen die eckigen Klammern dort?
void Write_Value(char daten1, int daten2);
-
Th69 schrieb:
Was sollen die eckigen Klammern dort?
void Write_Value(char daten1, int daten2);
da die Write_value in der Funktion Get_Rom_Content augerufen wird wie folgende z.B:
ucRomVal = Write_Value(0x7, ADR_DATA[i][1]);
also Write_Value soll dann so :
void Write_Value(char daten1, int daten2[][]);
deklariert werden.
Oder liege ich falsch?
danke
-
ADR_DATA[i][j]
ist vom Typint
, also nimmt die Funktion einenint
als Argument:void Write_Value(char daten1, int daten2);
-
icarus2 schrieb:
ADR_DATA[i][j]
ist vom Typint
, also nimmt die Funktion einenint
als Argument:void Write_Value(char daten1, int daten2);
Wenn ich aber so mache, dann bekomme ich diese Fehlermeldung:
Error [1131] type mismatch in assignment
bei folgende Zeile:
ucRomVal = Write_Value(0x7, ADR_DATA[i][0]);
-
Problem ist glöst.
Es lag daran, dass ich die Funktion als void deklariert habe.
-
Saheb schrieb:
Problem ist glöst.
Es lag daran, dass ich die Funktion als void deklariert habe.Beachte bitte, dass du der Fehlvorstellung unterliegst, dass ein Array ein Zeiger wäre, und/oder umgekehrt. Damit mag man bei unverschachtelten Strukturen noch mit etwas Glück davonkommen, aber dies hier:
void Write_Value(char daten1, int daten2[][]);
daten2 ist kein 2D-Array! Es ist ein Zeiger auf einen Zeiger auf int. Und da ein Array kein Zeiger ist und umgekehrt, ist daten2 auch nicht als ein Zeiger auf ein Array zu gebrauchen.