PDA

View Full Version : مبتدی: درخواست راهنمایی در یک برنامه



mhmorta
چهارشنبه 29 اردیبهشت 1389, 00:37 صبح
سلام دوستان
من یه مشکلی داشتم کمک میخواستم
در محیط KDE هستش
میخوام توی این برنامه ای گه میگذرم یه رشته ی اشاره گری رو سی این کنم ولی با مشکل زیر مواجه میشم :




#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <iostream>
#include <cstdlib>

using namespace std;
void input (int tel[5][7], char *name[5][19]);
int main(int argc, char *argv[])
{
int tel[5][7];
char *name[5][19];
input(tel,name);
return EXIT_SUCCESS;
}
/////////////////////////////////
void input (int tel[5][7],char *name[5][19]){
int i,j,k;
for (j=0,i=0;j<=7 && i <= 5;j++,i++){
cout << " enter tels: " << i+1 << endl;
cin >> tel[i][j];
}
for (k=0,i=0 ;k<=19 && i<=5;k++,i++){
cout << endl << " enter string : " << i+1 <<endl;
cin >> name[i][k];

}
}





[/CODE


]


و جواب برنامه :

[code]

[] enter tels: 1
211231
enter tels: 2
123312
enter tels: 3
1231213
enter tels: 4
121311
enter tels: 5
1231231
enter tels: 6
11111111

enter string : 1
aasdaasdaasdaa
/bin/sh: line 1: 3281 Segmentation fault /home/mehrzad/C++‎‎‎‎/esharegarha/debug/./src/esharegarha
Press Enter to continue!






البته تعداد کاکر های ورو یالان یکم کم و زیاد
ولی در کل همین طور همش


بسیار ممنون میشم از راهنمایی تون

mohsensaghafi
چهارشنبه 29 اردیبهشت 1389, 05:05 صبح
سلام دوست عزیز.
واقعیتش من نفهمیدم که تو برنامتون چرا این کار رو کردید. ولی به نکته بزرگ داره.


cin >> name[i][k];
name[i][k] از جنس char هست و شما دارید داخلش یه رشته می ریزید. این قسمت رو حل کنید مابقی رو متوجه خواهید شد.
و یک سوال چرا تلفن رو یه ماتریس گرفتید و فقط از قطر اصلی استفاده می کنید؟!!!!!

mhmorta
چهارشنبه 29 اردیبهشت 1389, 22:34 عصر
سلام
ممنون از جوابتون
اون قطر اصلی یه اشتباه بود یه طوری حلش کردم
در مورد این cin
راستش همون طور که میدونید برای گرفتن استیرینگ ها ۲ روش که همین cin و cin.get هستش
ولی توی kde به cin,get اور میگیره بدین شرح :




/home/mehrzad/C++‎/esharegarha/src/esharegarha.cpp:28: error: no matching function for call to 'std::basic_istream<char, std::char_traits<char> >::getline(char* (*&)[19], int)'
/usr/lib/gcc/x86_64-redhat-linux/4.4.1/../../../../include/C++‎/4.4.1/istream:593: note: candidates are: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::getline(_CharT*, std::streamsize, _CharT) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/x86_64-redhat-linux/4.4.1/../../../../include/C++‎/4.4.1/istream:405: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::getline(_CharT*,
std::streamsize) [with _CharT = char, _Traits = std::char_traits<char>

]


که البته بگم این طوری دارم میگیرم :


cin.getline ( name,19);نمیدونم مشکلش چیه
یادم یه دفعه دوستم زد cin.getline
و مشکلش حل شد
ولی الان نمیدونم ... نمیشه


ببخشید که با سوالات از \یش \ا افتاده ام اذیتتون میکنم
به عنوان یه ۱۶ ساله ببخشید


بسیار ممنون

mohsensaghafi
پنج شنبه 30 اردیبهشت 1389, 20:05 عصر
سلام دوست عزیز.
خواهش می کنم. سوال سواله.
نوع متعیر name رو هم واسم بگذار.
هر چند بصورت زیر هم می تونی از ورودی بخونی.

char name[80];
cin>>name

mhmorta
شنبه 01 خرداد 1389, 21:12 عصر
برنامه همون قبلی هسشت :


#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <iostream>
#include <cstdlib>

using namespace std;
void input (int tel[5][7], char *name[5][19]);
int main(int argc, char *argv[])
{
int tel[5][7];
char *name[5][19];
input(tel,name);
return EXIT_SUCCESS;
}
/////////////////////////////////
void input (int tel[5][7],char *name[5][19]){
int i,j,k;
i=0;
for (j=0;j<=7 && i<= 5 ;j++){
cout << " enter tels: " << i+1 << endl;
cin >> tel[i][j];
i++;
}
i=0;
for (k=0 ;k<=19 && i <= 5 ;k++){
cout << endl << " enter string : " << i+1 <<endl;
cin>>name[i][k];
i++;
}
}

ولی از طریق cin مشکلش اینه که اسبیس نمیشه زد

من مشکلم اینه که چرا توی جواب به این شکل :

enter tels: 1
23232323
enter tels: 2
23232323
enter tels: 3
23232323
enter tels: 4
23232323
enter tels: 5
23232323
enter tels: 6
23232323

enter string : 1
aaaaaaaaa
/bin/sh: line 1: 2725 Segmentation fault /home/mehrzad/C++/esharegarha/debug/./src/esharegarha
Press Enter to continue!


در حال که باید ۶ بار رشته رو بگیره یه بار میگیره و ارور میده :گریه::گریه:

خواهشا راهنمایی کنید

ممنون

mohsensaghafi
یک شنبه 02 خرداد 1389, 08:58 صبح
برنامه همون قبلی هسشت :


#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <iostream>
#include <cstdlib>

using namespace std;
void input (int tel[5][7], char *name[5][19]);
int main(int argc, char *argv[])
{
int tel[5][7];
char *name[5][19];
input(tel,name);
return EXIT_SUCCESS;
}
/////////////////////////////////
void input (int tel[5][7],char *name[5][19]){
int i,j,k;
i=0;
for (j=0;j<=7 && i<= 5 ;j++){
cout << " enter tels: " << i+1 << endl;
cin >> tel[i][j];
i++;
}
i=0;
for (k=0 ;k<=19 && i <= 5 ;k++){
cout << endl << " enter string : " << i+1 <<endl;
cin>>name[i][k];
i++;
}
}

ولی از طریق cin مشکلش اینه که اسبیس نمیشه زد

من مشکلم اینه که چرا توی جواب به این شکل :

enter tels: 1
23232323
enter tels: 2
23232323
enter tels: 3
23232323
enter tels: 4
23232323
enter tels: 5
23232323
enter tels: 6
23232323

enter string : 1
aaaaaaaaa
/bin/sh: line 1: 2725 Segmentation fault /home/mehrzad/C++‎/esharegarha/debug/./src/esharegarha
Press Enter to continue!


در حال که باید ۶ بار رشته رو بگیره یه بار میگیره و ارور میده :گریه::گریه:

خواهشا راهنمایی کنید

ممنون
دوست عزیز سلام
ما راهنمایی کردیم ولی شما دقت نمی کنی.
شما برای خوندن رشته، داری یک کاراکتر و می خونی نه یه رشته رو. name[i][k] یک کاراکتر هست و شما نمی تونید تو یه کاراکتر، به رشته رو ذخیره کنی.
من پیشنهاد می کنم که یا بار فصل مربوط به رشته ها در C++ رو یه مرور دیگه بکن. رشته، یک آرایه ای از کاراکتر هاست که به NULL ختم می شود. زمانی که می خواید یه رشته رو بخونید از ورودی باید آدرس یک آرایه کارکتری رو به دستور cin بدید نه یه کاراکتر رو.
cin>>name[k] می تونی این طوری رفعش کنی. البته به پروژه ات ربط داره که کدوم متغیر رو باید بگذاری اونجا.