Anzeige:
Ergebnis 1 bis 5 von 5

Thema: extern "C" malloc

  1. #1
    Registrierter Benutzer
    Registriert seit
    02.08.2008
    Beiträge
    177

    extern "C" malloc

    Hi,

    ich arbeite gerade an einen Programm mit Qt(C++) und unixodbc(C), doch bekomme ich dabei leider Probleme beim Anlegen eines dynamischen Objektes, weshalb ich Euch um Eure Hilfe bitten möchte.
    Code:
    #include <stdlib.h>
    #include <stdio.h>
    
    extern "C" {
      
    	int main(){
    		int nrows = 7;
    		int ncolumns = 3;
    		int **array;
    		array = malloc(nrows * sizeof(int *));
    		if(array == NULL){
    			  fprintf(stderr, "out of memory\n");
    			  return 0;
    		}
    		for(int i = 0; i < nrows; i++){
    			array[i] = malloc(ncolumns * sizeof(int));
    			if(array[i] == NULL){
    				  fprintf(stderr, "out of memory\n");
    				  return 0;
    			}
    		} 
    			  
    		for(int i = 0; i < nrows; i++)
    			free(array[i]);
    		  free(array);
    			  
    	}
    
    }
    Es wäre evtl. möglich (wenn ich es schaffe) auch den unixodbc C++ Wrapper zu verwenden. Doch zum einen möchte ich unixodbc möglichst Aufwandfrei verwenden und ist es zugegebener Maßen auch eine nette kleine Aufgabenstellung an mich, etwas C zu lernen.

    Vielen Dank!

  2. #2
    Registrierter Benutzer Avatar von jeebee
    Registriert seit
    01.01.2005
    Ort
    Bern || Zürich
    Beiträge
    540
    Was genau ist jetzt deine Frage? Auf den ersten Blick scheint der Code korrekt zu sein.
    my very own 128 bit integer
    C4 D3 B8 A8 9E A0 C6 EC 7D EC A8 15 28 D1 92 58
    more information

  3. #3
    Registrierter Benutzer
    Registriert seit
    02.08.2008
    Beiträge
    177
    Ups, wenn ich es mit g++ und extern "C" verwende, erhalte ich die Fehlermeldungen:
    Code:
    error: invalid conversion from ‘void*’ to ‘int**’
    error: invalid conversion from ‘void*’ to ‘int*’
    Wenn ich aber wieder extern "C" entferne und normal mit gcc es kompiliere, kommt die Fehlermeldung selbstverständlich nicht.

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Dann macht gcc eine implizite Typkonvertierung, die g++ nicht macht.
    Der Rückgabetyp von malloc ist void*, d.h. wenn du das auf einen int* Pointer schreiben willst, musst du nach int* casten

    Code:
    int *i = (int*)malloc(...);
    Oder nicht als extern C sondern als C++ mit

    Code:
    int *i = new int[...];
    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  5. #5
    Registrierter Benutzer
    Registriert seit
    02.08.2008
    Beiträge
    177
    Stimmt, manchmal ist die Lösung so offensichtlich, das man sie einfach nicht sieht. Ich war zu verwirrt wegen des extern "C", doch dürfte die Typkonvertieren auch im gcc keine Probleme bereiten, deshalb ist es ja auch egal, das es noch zusätzlich gemacht wird.

    Viel Dank Euch!

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •