Delphi-PRAXiS
Seite 1 von 2  1 2      

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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:15 Uhr.
Seite 1 von 2  1 2      

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