seltsame für mich unlösbare errors

Gast #2939924
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
}
Gast #2940028
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;
> }
Gast #2940029
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.)"
Gast #2940147
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren