Forum: PC-Programmierung seltsame für mich unlösbare errors


von mangosaft (Gast)


Lesenswert?

Hallo folgendes Problem:
och code gerade an einen kleinen  comporttool, welches schreiben und 
lesen soll, multithreaded, aber ich bekomme beim compilieren errors

ich verwende codeblocks mit den min gw compiler unter windoof

nämlich
1
 
2
obj\Debug\main.o||In function `main':|
3
D:\__coding\avr\atmega1284p lcd test\PCapp\comtool\main.cpp|32|undefined reference to `_imp__pthread_create'|
4
D:\__coding\avr\atmega1284p lcd test\PCapp\comtool\main.cpp|38|undefined reference to `_imp__pthread_create'|
5
D:\__coding\avr\atmega1284p lcd test\PCapp\comtool\main.cpp|44|undefined reference to `_imp__pthread_join'|
6
D:\__coding\avr\atmega1284p lcd test\PCapp\comtool\main.cpp|45|undefined reference to `_imp__pthread_join'|
7
||=== Build finished: 4 errors, 0 warnings ===|

im mingw rootdir is pthread.h und libpthread.a drinnen...

hier der zugehörige code...
1
/**************************************************
2
3
file: main.c
4
purpose: simple demo that receives characters from
5
the serial port and print them on the screen
6
author: -
7
email: futschaß1@gmx.at
8
9
**************************************************/
10
11
#include <stdlib.h>
12
#include <stdio.h>
13
#include <pthread.h>
14
#include <pthread.h>
15
16
#ifdef _WIN32
17
#include <Windows.h>
18
#else
19
#include <unistd.h>
20
#endif
21
22
#include "rs232.h"
23
#include <stdint.h>
24
25
static void *read_rs232(void* val);
26
static void *send_command_rs232(void* val);
27
28
int main()
29
{
30
    pthread_t p1, p2;
31
    uint8_t ERR;
32
33
    ERR = pthread_create(&p1,NULL,&read_rs232,NULL);
34
    if( ERR != 0 )
35
    {
36
        printf("Konnte Thread 1 nicht erzeugen\n");
37
        return EXIT_FAILURE;
38
    }
39
    ERR = pthread_create(&p2,NULL,&send_command_rs232,NULL);
40
    if( ERR != 0 )
41
    {
42
        printf("Konnte Thread 1 nicht erzeugen\n");
43
        return EXIT_FAILURE;
44
    }
45
    pthread_join( p1, NULL );
46
    pthread_join( p1, NULL );
47
    return(0);
48
}
49
static void *send_command_rs232(void *ch)
50
{
51
    ch = ch;
52
    char buffer;
53
    while(1) //bei ESC beenden
54
    {
55
        buffer = getchar();
56
        if (buffer == 27 )
57
        {
58
            break;
59
        }
60
    }
61
    return 0;
62
}
63
static void *read_rs232(void *ch)
64
{
65
    int cport_nr = 5;
66
    int bdrate=115200;
67
    ch = ch;
68
    unsigned char buf[4096];
69
    int i;
70
    int n;
71
72
    do
73
    {
74
        printf("select comport (look on your devicelist) \n");
75
        scanf("%d",&cport_nr);
76
        printf("Enter selected BAUDRATE \n");
77
        scanf("%d",&bdrate);
78
        printf("BAUDRATE: %d, COMPORT: %d, is selected \n",bdrate,cport_nr);
79
        cport_nr -=1;
80
    }
81
    while(OpenComport(cport_nr,bdrate));
82
    printf("comport opened \n");
83
84
85
    while(1)
86
    {
87
        n = PollComport(cport_nr, buf, 4095);
88
89
        if(n > 0)
90
        {
91
            buf[n] = 0;   /* always put a "null" at the end of a string! */
92
93
            for(i=0; i < n; i++)
94
            {
95
                if(buf[i] == 27) //if theres a ESC command -> close programm
96
                {
97
                    break;
98
                    return 0;
99
                    buf[i] = '.';
100
                }
101
102
            }
103
104
        printf("%s\n",(char *)buf);
105
        }
106
    Sleep(100);
107
    }
108
    return 0;
109
}

von Möwie (Gast)


Lesenswert?

-pthread ?

von Rolf Magnus (Gast)


Lesenswert?

mangosaft schrieb:
> im mingw rootdir is pthread.h und libpthread.a drinnen...

Linkst du denn auch an die libpthread.a?

von Dr. Tech (Gast)


Lesenswert?

mangosaft schrieb:
...
> hier der zugehörige code...
...
> file: main.c
> purpose: simple demo that receives characters from
> the serial port and print them on the screen
> author: -
> email: futschaß1@gmx.at
>

Do schau her a Österreicher! Treffender Name, Mr. Futschas ;-)

>     pthread_join( p1, NULL );
>     pthread_join( p1, NULL );

Das ist gewollt? Was macht das ?

Meinst du nicht:
pthread_join( p1, NULL );
pthread_join( p2, NULL );


> }
> static void *send_command_rs232(void *ch)
> {
>     ch = ch;
was soll das? Initialisierung ? Oder für was ist das?

>     char buffer;

was soll das?
char buffer;

wenn schon, fehlt dann wieder die abschliessende 0: *buffer = '\0';



> static void *read_rs232(void *ch)
> {
>     int cport_nr = 5;
>     int bdrate=115200;
>     ch = ch;
>     unsigned char buf[4096];
>     int i;
>     int n;

int werte initialisieren..


>             buf[n] = 0;   /* always put a "null" at the end of a string! */
es heisst nicht, "put a 'null'" sondern "put a zero" ;-)
du meinst wohl, wieder, buf[n] = '\0';

>
>             for(i=0; i < n; i++)
>             {
>                 if(buf[i] == 27) //if theres a ESC command -> close programm
>                 {
>                     break;
>                     return 0;
>                     buf[i] = '.';
>                 }
>
>             }
>
>         printf("%s\n",(char *)buf);
>         }
>     Sleep(100);
>     }
>     return 0;
> }

von Dr. Tech (Gast)


Lesenswert?

Hier noch ein Tipp, für dich, was wahrscheinlich die Lösung für dein 
Problem ist: Suchen ist doch nicht schwer...Mann, mann..ihr müsst 
selbständiger werden, sowohl auf der Uni als auch im Beruf ;)

"Move -lpthread to the end of that command:

g++ -ohello.exe hello.cc -lpthread
The order of the arguments is important. (Using -pthread throughout 
instead of -lpthread for linking is actually recommended, since it sets 
flags both for the preprocessor and the linker.)"

von Rolf Magnus (Gast)


Lesenswert?

Dr. Tech schrieb:
>> }
>> static void *send_command_rs232(void *ch)
>> {
>>     ch = ch;
> was soll das? Initialisierung ? Oder für was ist das?

Vermutlich um eine Warnung wegen unbenutztem Parameter zu vermeiden.

>>     char buffer;
>
> was soll das?
> char buffer;

Was meinst du mit dieser Frage? Damit wird eine char-Variable namens 
buffer angelegt.

> wenn schon, fehlt dann wieder die abschliessende 0: *buffer = '\0';

Bei einem char gibt es nichts abzuschließen. Du verwechselst es 
offensichtlich mit einem Array aus char.

>>             buf[n] = 0;   /* always put a "null" at the end of a string! */
> es heisst nicht, "put a 'null'" sondern "put a zero" ;-)
> du meinst wohl, wieder, buf[n] = '\0';

0 und '\0' ist das gleiche.

>>     int i;
>>     int n;
>
> int werte initialisieren..

Kann man machen und auch als sauberer ansehen, aber notwendig ist es 
nicht.

von mangosaft (Gast)


Lesenswert?

Hallo,
Also Problem dank Dr.Tech gelöst! Lib verlinken und Sache hatte sich!
Zum Programm selbst, ja ich weiß es ist nicht schön, aber es 
funktioniert!

Mfg

von Dr. Tech (Gast)


Lesenswert?

mangosaft schrieb:
> Hallo,
> Also Problem dank Dr.Tech gelöst! Lib verlinken und Sache hatte sich!
> Zum Programm selbst, ja ich weiß es ist nicht schön, aber es
> funktioniert!
>
> Mfg

Bitte, gerne, kein Problem, war doch nicht so schwer :-)

Weiss doch dass ich gut bin, bin jetzt schon in Feiertagsstimmung ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.