2016-04-18 13 views
-1

Ich habe das Producer/Consumer-Problem in C entwickelt und aus irgendeinem Grund kompiliert es nicht. Ich erhalte die Fehlermeldung:Producer Consumer Solution

try1.c: In function ‘main’: 

try1.c:19:21: warning: incompatible implicit declaration of built-in function ‘malloc’ [enabled by default] 

     BUFFER=(char *) malloc(sizeof(char) * BufferSize); 

Bitte könnte jemand das Problem identifizieren? Habe es schon eine Weile probiert, das jetzt zu beheben, habe aber kein Glück gehabt.

#include <stdio.h> 
#include <pthread.h> 
#define BufferSize 10 

void *Producer(); 
void *Consumer(); 

int BufferIndex=0; 
char *BUFFER; 

pthread_cond_t Buffer_Not_Full=PTHREAD_COND_INITIALIZER; 
pthread_cond_t Buffer_Not_Empty=PTHREAD_COND_INITIALIZER; 
pthread_mutex_t mVar=PTHREAD_MUTEX_INITIALIZER; 

int main() 
{  
    pthread_t ptid,ctid; 

    BUFFER=(char *) malloc(sizeof(char) * BufferSize);    

    pthread_create(&ptid,NULL,Producer,NULL); 
    pthread_create(&ctid,NULL,Consumer,NULL); 

    pthread_join(ptid,NULL); 
    pthread_join(ctid,NULL); 


    return 0; 
} 

void *Producer() 
{  
    for(;;) 
    { 
     pthread_mutex_lock(&mVar); 
     if(BufferIndex==BufferSize) 
     {       
      pthread_cond_wait(&Buffer_Not_Full,&mVar); 
     }       
     BUFFER[BufferIndex++]='@'; 
     printf("Produce : %d \n",BufferIndex); 
     pthread_mutex_unlock(&mVar); 
     pthread_cond_signal(&Buffer_Not_Empty);   
    }  

} 

void *Consumer() 
{ 
    for(;;) 
    { 
     pthread_mutex_lock(&mVar); 
     if(BufferIndex==-1) 
     {    
      pthread_cond_wait(&Buffer_Not_Empty,&mVar); 
     }     
     printf("Consume : %d \n",BufferIndex--);   
     pthread_mutex_unlock(&mVar);   
     pthread_cond_signal(&Buffer_Not_Full);     
    }  
} 

Vielen Dank für Ihre Hilfe.

+1

Das ist kein Fehler, sondern eine Warnung. Das verhindert nicht, dass der Code kompiliert wird. –

+0

Ein Malloc mit einer Besetzung, und doch ist die Warnung immer noch da. Wie interessant ... – 2501

+0

Fügen Sie '#include ' hinzu, um die Warnung zu entfernen. –

Antwort

0

Fügen Sie einfach die Bibliothek stdlib.h ein. Diese Bibliothek enthält die Funktion malloc().

0

Sie verwenden malloc ohne die Header-Datei, die es deklariert (stdlib.h).

Ihre Nutzung (ohne dass explizite Deklaration von stdlib.h) erstellt eine „implizite Deklaration“, die nicht den einen passt der Compiler kennt, weil Ihr kehrt char* und die richtigen malloc kehrt void*.

Fügen Sie also include <stdlib.h> hinzu und beachten Sie auch, dass Sie das Ergebnis eines malloc nicht umsetzen sollten. Siehe Do I cast the result of malloc?

+0

Korrigieren bis zu dem Punkt "stimmt nicht mit dem überein, von dem der Compiler weiß ..."'- als inkorrekt :) – SergeyA

+0

Sie haben gerade in Ihrer eigenen Antwort gesagt, dass der" Compiler weiß, was malloc ist ". Wie sonst kann es sich beschweren "inkompatible implizite Deklaration der eingebauten Funktion 'malloc'" wenn die 'malloc'-Funktion nicht deklariert wurde? – GrahamS

+0

tat ich. Und ich stehe zu meiner Antwort und meinem Kommentar. Tipp - Die Idee, dass der Compiler über malloc Bescheid weiß, ist richtig. Es ist der * Rückgabetyp * dieses Teils, der falsch ist. Lies meine Antwort, um die richtige zu sehen. – SergeyA

1

Zunächst einmal hat diese Frage nichts mit Hersteller/Verbraucher zu tun. Es hat mit der Verwendung einer Funktion zu tun, die Sie nicht deklariert haben.

Historisch erlaubt C Aufruf einer Funktion, die nie deklariert wurde. Da eine technische Funktionsdeklaration nicht benötigt wird, um sie aufzurufen, fügte der Compiler gerne Anweisungen hinzu, um die unbekannte Funktion aufzurufen. Angeblich erlaubte es Entwicklern, wertvolle Tastenanschläge zu sparen. Sie benötigen jedoch eine Funktionsdeklaration, um den Rückgabewert zu kennen, und der Compiler hat angenommen, dass der Rückgabewert einer solchen Funktion int ist. Und Sie haben gerade das - eine implizit erklärte malloc() mit angenommenen Rückgabetyp von int.

Nun, Compiler weiß was malloc() ist. Es ist oft eingebaute intrinsische Funktion. Der Compiler weiß aber auch, dass der Rückgabewert des besagten malloc()void* ist, nicht int - und damit klagt er.

Lösung - die implizite Deklaration loswerden und es sich zur Angewohnheit machen, für jede Funktion, die Sie verwenden, immer geeignete Header-Dateien zu verwenden.

Sie haben auch Probleme mit der Art, wie Sie bedingte Variablen verwenden, aber ich würde es für eine andere Frage verlassen.

Verwandte Themen