1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

C: extern Funktionen

Discussion in 'Programmieren' started by dreisson, Sep 13, 2007.

Thread Status:
Not open for further replies.
  1. dreisson

    dreisson ROM

    Hallo zusammen,
    ich bin beim C-programmieren ein anfänger. Ich habe folgendes Ziel:
    Ich will eine Funktion programmieren, die ein Array aus nullen und einser erzeugt.
    so ist das Prinzip der Funktion:
    name: GenerateBitStream(int *bitfolge, 13)
    also die funktionen erzeugt einen Array "Bitfolge" der länge 13. Inhalt vom Array ist zufällige Folge von Null und eins.
    Ich bin folgender Massen gegangen:
    1: Ich habe folgende Header Datei geschrieben (BitStream.h):

    ---------------------------
    #ifndef BitStream_h
    #define BitStream_h

    #include<stdio.h>
    #include<stdlib.h>

    extern int *GenerateBitStream(int*, int );

    #endif
    --------------------------

    2: dann habe ich die funktion GenerateBitStream.c geschrieben:

    ---------------------------
    #include"BitStream.h"
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>

    int *GenerateBitStream(int *bits, int length){

    srand48(time(NULL));

    for (int i = 0; i <= length-1; i++) {
    if (drand48() < 0.5)
    *(bits+i) = 1;
    else
    *(bits+i) = 0;
    }
    return bits;
    }
    ----------------------

    zum Testen der Funktion habe ich folgendes Testprogramm (test.c)geschrieben:
    ----------------------

    #include<stdio.h>
    #include"BitStream.h"

    int main(){

    int *BitSequence;
    int i=0;

    GenerateBitStream(BitSequence,10);

    for (i=0; i<10; i++){
    printf("%d ",*(BitSequence+i));
    }
    }
    -----------------------------

    Das Programm test.c habe ich so compiliert: "gcc test.c -o test" leider kommt folgende Fehlermeldung:

    Undefined first referenced
    symbol in file
    GenerateBitStream /usr/tmp/ccp19vfe.o
    ld: fatal: Symbol referencing errors. No output written to test
    collect2: ld returned 1 exit status

    Meine Frage wäre: gibts einen Fehler im Code? ist das zusammen binden der drei dateien test.c BitStream.h und GenerateBitStream so wie ich es gemacht habe richtig?

    viele Grüsse
    Dreisson
     
  2. m4cg33k

    m4cg33k Byte

    Jede Menge:

    - Kein Speicherplatz fuer dein Array reserviert
    - Array Elemente falsch addressiert, ein Integer ist 32 bit also
    musst du schon 4 zur Basis mit jeder Iteration addieren
    - Warum gibst du einen Pointer zurueck den du der Funktion als
    Parameter uebergeben hast?
    - Falsch kompiliert, wenn du GenerateBitStream.c nicht kompilierst
    kann der Linker die Funktion auch nicht finden
    .
    .
    .

    Hier mal die fix korrigierte Version, sollte das tun was du willst.
    4Byte fuer jedes Bit ist aber eine ziemliche Verschwendung ;)

    Code:
    /* BitStream.h */
    #ifndef BitStream_h
    #define BitStream_h
    
    #include<stdio.h>
    #include<stdlib.h>
    
    extern void GenerateBitStream(int*, int);
    
    #endif
    
    Code:
    /* GenerateBitStream.c*/
    #include "BitStream.h"
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    void GenerateBitStream(int *bits, int length) {
    
    srand48(time(NULL));
    
    int i;
    
    for (i = 0; i < length; i++) {
    	bits[i] = (drand48() < 0.5)? 1 : 0;
    	}
    }
    
    Code:
    /* test.c */
    #include <stdio.h>
    #include "BitStream.h"
    
    int main(){
    
    int *BitSequence;
    int i = 0;
    int length = 10;
    
    BitSequence = malloc(sizeof(int) * length);
    
    GenerateBitStream(BitSequence, length);
    
    for (i = 0; i < 10; i++) {
    	printf("%d ", BitSequence[i]);
    	}
    }
    
    (bei malloc sollte man noch aufpassen das man keinen
    Nullpointer bekommt aber das hab ich jetzt mal weggelassen)

    Und so kompilieren:

    Code:
    $ gcc -o tollesProgramm GenerateBitStream.c test.c
     
  3. dreisson

    dreisson ROM

    Hey! Danke für die ausführliche Antwort. Ich habe das Programm so implimentiert wie du es beschrieben hast. Allerdings Es kommen folgende Fehlermeldungen:

    GenerateBitStream.c: In function `GenerateBitStream':
    GenerateBitStream.c:13: parse error before `int'
    GenerateBitStream.c:15: `i' undeclared (first use in this function)
    GenerateBitStream.c:15: (Each undeclared identifier is reported only once
    GenerateBitStream.c:15: for each function it appears in.)

    ich kappiere nicht warum meckert er wegen dem i ?? :aua: Das i habe ich doch deklariert.
     
Thread Status:
Not open for further replies.

Share This Page