PDA

Tam Sürümünü Görmek İçin : yardım! gets() bana kelek yapıyor sanırım


sekcan
16/05/2007, 02:58
Merhabalar. Aşağıda ödevimin main fonksiyonun bir kısmı var.
Kullanıcı cmd ekranından MatLab formatında matris girecek
(Örn. [6 -2 1 11 ; -2 7 2 5 ; 1 2 -5 -1]).
Bu inputu double arraya atıp print_double_array() fonksiyonuyla yazdırıyorum.
Gayet düzgün bir şekilde yazıyor :

6.000000 -2.000000 1.000000 11.000000
-2.000000 7.000000 2.000000 5.000000
1.000000 2.000000 -5.000000 -1.000000

Program bu aşamada matris diagonally dominant mı diye kontrol edecek (ne anlama geldiğinin bir önemi yok). Eğer öyleyse while döngüsünden çıkıp diğer işlemlere geçecek.
Ama öyle değilse while döngüsünde başa alıp kullanıcıdan tekrar matris ve epsilon değerlerini isteyecek.Ama tam bu noktada program nedense "gets(str)"yi atlıyor ve
kullanıcıdan sadece epsilon değerini istiyor.
print_double_array() fonksiyonu da ekrana sadece "0.000000" yazıyor.
Bunun nedeni ne olabilir? Nasıl çözebilirim?
stdin'in flush edilmesi gerekiyor olabilir mi?
Eğer öyleyse nasıl yapabilirim?


#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <math.h>

#define SIZE 15
#define T_SIZE 150

int main()
{ char str[T_SIZE];

double temp_matrix[T_SIZE] = {0};
double matrix[SIZE][SIZE] = {0};

int row, column, num_of_elements;
double epsilon = 0.0;

while (1) { printf("Enter the matrix in MatLab format :\n --> ");
gets(str);

printf("Enter the Epsilon : ");
scanf("%lf", &epsilon);

make_matrix(str, temp_matrix, &num_of_elements);

row = get_rows(str);
column = num_of_elements / row;

make_double_array(matrix, temp_matrix, row, column);

print_double_array(matrix, row, column);

if (is_dominant(matrix, row, column)) break;
else printf("Matrix is not diagonally dominant\n\n");
}
print_double_array(matrix, row, column);

return 0;
}


Şimiden herkese teşekkür ederim.:hey:


golgepapaz
16/05/2007, 03:22
fflush( stdin );
printf("Enter the matrix in MatLab format :\n --> ");
gets(str);

bu microsoft icin calisir,ama fflush'in etkisinin normalda input stream lar icin undefined oldugunuda belirtiyim..ayrica gets'in de str nin boyutuna dikkat etmedigini ayrica belirteyim. fgets daha iyi bir cozum olabilir. gerci o zmanada sondaki newline karakterinin halletmen gerekiyor....

sekcan
16/05/2007, 13:17
Teşekkür ederim golgepapaz
onun yerine

printf("Enter the matrix in MatLab format :\n --> ");
rewind(stdin);
gets(str);

bunu yaptım düzgün çalıştı.
burda undefined bi davranış söz konusu mu?

golgepapaz
16/05/2007, 13:52
calisiyorsa problem yok, ama portable olup olmadigindan emin degilim... platfor degismiycekse cok da onemli degil zaten....

sekcan
16/05/2007, 15:33
çalışıyor ama problem yok diyemeyiz
fflush'daki gibi undefined davranış olup olmadığından emin değilim çünkü
tekrar teşekkür ederim

quasimodo
17/05/2007, 16:39
bu microsoft icin calisir,ama fflush'in etkisinin normalda input stream lar icin undefined oldugunuda belirtiyim..
Biraz aciklayabilirmisin?

golgepapaz
17/05/2007, 17:01
standarda gore
int fflush(FILE (http://www.utas.edu.au/infosys/info/documentation/C/CStdLib.html#FILE)* stream);Flushes stream stream and returns zero on success or EOF (http://www.utas.edu.au/infosys/info/documentation/C/CStdLib.html#EOF) on error. Effect undefined for input stream. fflush (http://www.utas.edu.au/infosys/info/documentation/C/CStdLib.html#fflush)(NULL (http://www.utas.edu.au/infosys/info/documentation/C/CStdLib.html#stdio.NULL)) flushes all output streams.
http://www.utas.edu.au/infosys/info/documentation/C/CStdLib.html#stdio.h

acehreli
17/05/2007, 19:08
Turkce ozeti: fflush, cikis akimlarinin ara belleklerinde tuttuklari karakterleri cikis cihazina gonderir; giris akimlariyla nasil davranacagi tanimlanmamistir.

Ali