Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [C] fgets() wird nicht ausgeführt (https://www.delphipraxis.net/156392-%5Bc%5D-fgets-wird-nicht-ausgefuehrt.html)

fwsp 30. Nov 2010 14:18

[C] fgets() wird nicht ausgeführt
 
hallo,

für einen kleinen chat habe ich folgenden code geschrieben. allerdings wird in der main function das fgets nicht ausgeführt (getchar & scanf genauso wenig). hat jmd einen hinweis? das 2. programm realisiert das senden und funktioniert fehlerfrei.

ich verwende TC2.01 unter Win98

Code:
#include <stdio.h>

#define FALSE 0
#define TRUE !FALSE

#define SYN 22
#define NUL 0
#define DELAY 20
#define PORT 768
#define BUFFER_LEN 1024

int idx;
char buffer[BUFFER_LEN] = "";

/* Dummys */
char inportb() {char c;scanf("%c", &c);return c;}
void outportb(int port, char c) {printf("%c ", c);}
void delay() {}

void write() {
   idx = 0;
   
   do {
      outportb(PORT, SYN);
      delay(DELAY);
      outportb(PORT, buffer[idx]);
      delay(DELAY);      
   } while (buffer[idx] != NUL && ++idx);
}

char read_char() {
   char in;
    int syn_found = FALSE;

   while (TRUE) {   
      if ((in = inportb(PORT)) == SYN) {
         syn_found = TRUE;
           continue;
         }
      if (syn_found) {
         buffer[idx++] = in;
         return in;
        }
     }
}

void read() {
   idx = 0;
   while (read_char() != NUL)
      ;
}

int main() {
   int is_sender = TRUE;
   
   while (TRUE) {
      if (is_sender) {
         printf("write:\n");
         fgets(buffer, BUFFER_LEN, stdin); /* <-- Hier ist der Fehler /////////////////////////////////*/
         write();
         buffer[0] = NUL;
         is_sender = !is_sender;
      }
      else {
         printf("read:\n");
         read();
         printf("%s\n", buffer);
         buffer[0] = NUL;
         is_sender = !is_sender;
      }
   }
}
Code:
#include <stdio.h>

#define FALSE 0
#define TRUE !FALSE

#define SYN 22
#define NUL 0
#define DELAY 20
#define PORT 768
#define BUFFER_LEN 1024

int idx;
char buffer[BUFFER_LEN] = "";

char inportb() {char c;scanf("%c", &c);return c;}
void outportb(int port, char c) {printf("%c ", c);}
void delay() {}

void write() {
   idx = 0;
   
   do {
      outportb(PORT, SYN);
      delay(DELAY);
      outportb(PORT, buffer[idx]);
      delay(DELAY);      
   } while (buffer[idx] != NUL && ++idx);
}

int main() {
   printf("write:\n");
   fgets(buffer, BUFFER_LEN, stdin);
   write();
   buffer[0] = NUL;
   
   return 0;
}

fwsp 30. Nov 2010 18:23

AW: [C] fgets() wird nicht ausgeführt
 
kleiner nachtrag, fgets wird nicht ausgeführt heißt, das er bis zum fgets alles korrekt ausführt, aber keine tastatureingabe zulässt, es erscheinen keine buchstaben im terminal. auch alles nach dem fgets wird nicht ausgeführt.

Assarbad 30. Nov 2010 18:28

AW: [C] fgets() wird nicht ausgeführt
 
Was versuchste denn zu erreichen?

Vom Aufruf von fgets() kehrt der Code meines Erachtens nach erst dann zurück wenn die Anzahl Zeichen gelesen wurde, oder irre ich mich?

Du solltest übrigens fflush() vor fgets() aufrufen.

fwsp 30. Nov 2010 18:32

AW: [C] fgets() wird nicht ausgeführt
 
Zitat:

Zitat von Assarbad (Beitrag 1065178)
Vom Aufruf von fgets() kehrt der Code meines Erachtens nach erst dann zurück wenn die Anzahl Zeichen gelesen wurde, oder irre ich mich?

irrst dich, die länge is die max zahl an zeichen.
fflush is afaik nur für scanf interessant, oder?

Assarbad 30. Nov 2010 18:37

AW: [C] fgets() wird nicht ausgeführt
 
Zitat:

Zitat von fwsp (Beitrag 1065180)
Zitat:

Zitat von Assarbad (Beitrag 1065178)
Vom Aufruf von fgets() kehrt der Code meines Erachtens nach erst dann zurück wenn die Anzahl Zeichen gelesen wurde, oder irre ich mich?

irrst dich, die länge is die max zahl an zeichen.

Okay, ich werf mal GDB an.

Zitat:

Zitat von fwsp (Beitrag 1065180)
fflush is afaik nur für scanf interessant, oder?

Nein allgemein.

Assarbad 30. Nov 2010 18:46

AW: [C] fgets() wird nicht ausgeführt
 
Also bei mir wird es erst beim Zweiten mal nicht mehr vernünftig ausgeführt.

Code:
$ gdb ./fle
GNU gdb (GDB) 7.1-ubuntu
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/oliver/test/fle...done.
(gdb) b main
Breakpoint 1 at 0x400814: file fle.c, line 54.
(gdb) run
Starting program: /home/oliver/test/fle

Breakpoint 1, main () at fle.c:54
54         int is_sender = TRUE;
(gdb) n
57            if (is_sender) {
(gdb)
58               printf("write:\n");
(gdb)
write:
59               fgets(buffer, BUFFER_LEN, stdin); /* <-- Hier ist der Fehler /////////////////////////////////*/
(gdb) p buffer
$1 = '\000' <repeats 1023 times>
(gdb) p BUFFER_LEN
$2 = 1024
(gdb) c
Continuing.
cjlfwenbchkjwebfcfjwkecbwreckjwrcb
 c j l f w e n b c h k j w e b f c f j w k e c b w r e c k j w r c b
   read:
dwcjklwshckjwebcwkcwbecwbc
Nachtrag: hmm, is ja klar wenn ich den Code lese (besonders das else).

Noch'n Nachtrag: also wo ist jetzt dein Problem? Rein prinzipiell sollte der Code funzen.

fwsp 30. Nov 2010 19:05

AW: [C] fgets() wird nicht ausgeführt
 
er "hängt" beim fgets. danach geht nix mehr. keine reaktion

Assarbad 30. Nov 2010 19:29

AW: [C] fgets() wird nicht ausgeführt
 
Du gibst aber schon was ein und drückst dann Enter, oder? :stupid:

Wenn das ein Windows-98-spezifisches Problem sein sollte, könnte es schwer werden dir zu helfen. Ich zumindest habe hier keine Kopie mehr rumliegen.

fwsp 30. Nov 2010 20:09

AW: [C] fgets() wird nicht ausgeführt
 
Zitat:

Zitat von Assarbad (Beitrag 1065200)
Du gibst aber schon was ein und drückst dann Enter, oder? :stupid:

nein.

ich KANN nichts eingeben.

Assarbad 30. Nov 2010 20:23

AW: [C] fgets() wird nicht ausgeführt
 
Zitat:

Zitat von fwsp (Beitrag 1065217)
Zitat:

Zitat von Assarbad (Beitrag 1065200)
Du gibst aber schon was ein und drückst dann Enter, oder? :stupid:

nein.

ich KANN nichts eingeben.

Aha, faszinierend. Das ist ein Detail was so leider bisher nicht herauskam ;)

Einerlei. TC klingt nach TurboC, also DOS, richtig? Was passiert denn exakt wenn du dein Programm in einer geöffneten DOS-Konsole startest? Zeigt nur das "write:" und dann nix?

Woran erkennst du denn daß du nix eingeben kannst? Vielleicht werden die Eingaben nur nicht auch ausgegeben?

fwsp 30. Nov 2010 20:28

AW: [C] fgets() wird nicht ausgeführt
 
turboC unter win98.
das write kommt, ein printf() hinter dem fgets wird nicht mehr abgehandelt.
das 2. programm läuft ohne fehler. das is noch interessanter.

Assarbad 30. Nov 2010 20:33

AW: [C] fgets() wird nicht ausgeführt
 
Zitat:

Zitat von fwsp (Beitrag 1065224)
das 2. programm läuft ohne fehler. das is noch interessanter.

Das erste läuft bei mir unter Ubuntu auch. Ist also nicht aussagekräftig ohne ein Windows 98 zur Hand zu haben.

Schon ein fflush(NULL) vor dem fgets() versucht?

fwsp 30. Nov 2010 20:36

AW: [C] fgets() wird nicht ausgeführt
 
ja, glaub hab ich schon probiert. aber ich hab die rechner net hier, kann ich jetzz grad nicht probieren.

Assarbad 30. Nov 2010 20:38

AW: [C] fgets() wird nicht ausgeführt
 
Dann habe ich meine Ideen verbraten. Keine Ahnung, ohne einen Debugger würde ich mir da keine weiteren Diagnoseversuche zutrauen. Aber vielleicht sind ja Bugs in TurboC von damals bekannt ...

fwsp 30. Nov 2010 20:43

AW: [C] fgets() wird nicht ausgeführt
 
Zitat:

Zitat von Assarbad (Beitrag 1065228)
Dann habe ich meine Ideen verbraten.

ich auch net, seit freitag häng ich da dran.

fwsp 1. Dez 2010 15:07

AW: [C] fgets() wird nicht ausgeführt
 
Code:
                       while ((c = getch()) != '\13') {
                               buf_out[idx_out++] = c;
                               printf("%c", c);
                       }
                       printf("\n");

                       buf_out[idx_out] = '\0';
das is mein workaround.

Assarbad 1. Dez 2010 19:54

AW: [C] fgets() wird nicht ausgeführt
 
Auch ne Variante :zwinker:


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz