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 Typ int , also nimmt die Funktion einen int als Argument:

    void Write_Value(char daten1, int daten2);
    


  • icarus2 schrieb:

    ADR_DATA[i][j] ist vom Typ int , also nimmt die Funktion einen int 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.


  • Mod

    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.


Anmelden zum Antworten