View Full Version : مبتدی: ارسال بک فایل به عنوان آرگومان تابع main()
vasilopita
جمعه 06 اسفند 1389, 23:38 عصر
سلام. لطفا من مبتدی رو ببخشید. به خدا خیلی زحمت می کشم ولی چی کار کنم هنوز مبتدی موندم. این کدی رو که می خوام بزارم یکی از مثال های کتاب جعفرنژاده. با اولین خط بعد از هدر فایل ها مشکل دارم نمی فهمم چیه؟ لطفا راهنمایی بفرمایید:
#include <fstream.h>
#include <iostream.h>
#include <stdlib.h>
#include <conio.h>
int main(int argc, char *argv[])
{
char ch;
int pc, po, bc, bo ;
pc = po = bc = bo = 0;
// clrscr();
if(argc < 2) {
cout << "usage : program filename.";
// getch();
exit(0);
}
ifstream fp(argv[1]);
if(!fp) {
cout << "Cannot open file.";
getch();
exit(0);
}
fp.get(ch);
while(!fp.eof()) {
switch(ch) {
case ')':
pc ++; break;
case '(':
po ++; break;
case '}':
bc ++; break;
case '{' :
bo ++;
}
fp.get(ch);
}
fp.close();
cout << "pc = " << pc << ", po = " << po
<< ", bc = " << bc << ", bo = " << bo;
// getch();
return 0;
}
r00tkit
شنبه 07 اسفند 1389, 11:18 صبح
سلام دقیقا" با چی مشکل داری ؟ با
int main(int argc, char *argv[])
خوب این تابع شروع ما هستش که می تونه پارامتر دریافت کنه
mehdi.mousavi
شنبه 07 اسفند 1389, 14:47 عصر
سلام.
اینقدر سوزناک نوشتید که خیلی تلاش می کنید اما به نتیجه نمیرسید، دلم سوخت :) ببینید. هر برنامه C/C++ ای که می نویسیم، یک مدخل ورودی داره. یعنی چی؟ یعنی وقتی exe ی اون برنامه اجرا میشه، اجرای برنامه از اون تابع (که بهش میگن مدخل ورودی، یا entry point) شروع میشه و از اون به بعد شما می تونید توابع دیگه رو Call کنید و برنامه رو پیش ببرید. Prototype یا Signature این تابع چیه؟ اینه:
int main(int argc, char *argv[]);
پارامتر اول، یعنی argc، مخفف arguments count هستش که داره نشون میده موقع اجرا شدن برنامه "چند تا" پارامتر به برنامه شما ارسال شده. وقتی شما exe ی خودتون رو اجرا می کنید، مقدار argc هستش 1. وقتی همون exe رو با بطور نمونه 3 پارامتر اجرا کنید، مقدار argc برابر 4 خواهد بود. بطور مثال من برناه myexe رو با دو پارامتر param1 و param2 اجرا می کنم، پس argc میشه 3. چرا 3؟ چون اولین پارامتر همیشه نام برنامه هستش.
myexe param1 param2
حالا پارامتر دوم چیه؟ argv یعنی argument's vector ... آرایه ای از پارامترهایی که هنگام اجرا داره به برنامه پاس میشه. وقتی برنامه شما اجرا میشه، (بدون هیچ argument ای)، همونطور که گفتم argc یک خواهد بود و argv نیز در خونه اولش، حاوی نام برنامه شما هستش. در مثال فوق، argv[0] میشه myexe. به همین ترتیب، پارامترهای اول و دوم، یعنی param1 و param2 در خونه های بعدی آرایه argv میشینن...
حالا این چه فایده ای داره؟ میتونید برنامه ای بنویسید که کاربر هنگام اجرا، پارامترهاشو تعیین کنه... اگر مایل بودید، میتونید از argc و argv استفاده کنید، اگر هم نه که خوب هیچ. فقط از Entry Point بودن main استفاده می کنید و کد مورد نظرتون رو در اون می نویسید.
موفق باشید.
vasilopita
دوشنبه 09 اسفند 1389, 10:50 صبح
از پاسختون ممنونم. حالا اگه بخوام این آرگومان ها رو به تابع ارسال کنم چجوری می تونم این کار رو انجام بدم. در ضمن من از vs استفاده می کنم.
drstrike
دوشنبه 09 اسفند 1389, 18:53 عصر
فایل رو تحت داس اجرا کنید و بعد نام فایل ارگومان رو بنویسید.مثل:
test arg_name
test نام فایل اجرایی و arg_name هم ارگومان ارسالی به تابع.
vasilopita
سه شنبه 10 اسفند 1389, 00:08 صبح
لطفا بیشتر راهنمایی کنید. توی کتاب آقای جعفر نژاد به دو روش اشاره شده. ولی درست و حسابی توضیح نداده.
mehdi.mousavi
سه شنبه 10 اسفند 1389, 19:01 عصر
لطفا بیشتر راهنمایی کنید. توی کتاب آقای جعفر نژاد به دو روش اشاره شده. ولی درست و حسابی توضیح نداده.
سلام.
دو روش برای انجام چه کاری؟ پاس دادن Argument ها به main؟ یکیش رو که جناب drstrike فرمودن،
روش بعدی هم این هستش که از طریق Visual Studio اینکارو کنید (این روش برای Debug برنامه مناسب هستش).
برای اینکار باید Properties پروژه رو باز کنید، از سمت چپ پنجره قسمت Debugging رو انتخاب کنید، سمت راست هم جلوی
Command Arguments پارامترهای ورودی مورد نظرتون رو قرار بدید. سپس OK بزنید و شروع به Debug کردن برنامه کنید...
67003
موفق باشید.
Sarv 123
چهارشنبه 25 مرداد 1391, 04:22 صبح
با سلام و تشکر از راهنمایی های ارزشمند شما
من تونستم به همون شکلی که گفته بودین پارامتر های مورد نظرم رو به تابع Main از یک برنامه ( exe. ) دیگه ارسال کنم.
اما به یک مشکل برخوردم:
اونم اینه که نمی تونم یک متغییر رو به عنوان ورودی بفرستم به Main
int main()
{
char s[100];
cin>>s;
system("test.exe");
getch();
}
من هدفم اینه که s رو به عنوان ورودی بفرستم به برنامه test.exe
لطفا راهنماییم کنید.
#target
چهارشنبه 25 مرداد 1391, 05:29 صبح
با استفاده از توابع strcat , strcpy اینکارو کنید . اول نام فایل رو داخل ارایه بذارید بعد با تابع strcat مقدار s رو به رشته که نام فایل رو داره اضافه کنید بعدش نتیجه رو به تابع سیستم بدین . البته اگه از کلاس string استفاده کنی ساده تر میشه
Sarv 123
چهارشنبه 25 مرداد 1391, 07:33 صبح
ممنونم.
ولی چند سوال دیگه هم واسم بوجود اومد:
1. آیا محدودیتی برای ارسال پارامتر به تابع Main وجود داره؟
2. یا میشه مثلا یک آرایه از اعداد صحیح به همراه یک رشته و یک عدد اعشاری رو همزمان به Main فرستاد؟
اگه میشه، چطور باید این کارو کرد؟
درک موضوع زیر کمی واسم دشواره.
Prototype تابع Main رو به صورت زیر فرض کنین:
int main( int argc, char * argv[] );
حالا ما قراره در یک جایی از برنامه این تابع Main رو فراخوانی و از خروجیش استفاده کنیم. فراخوانی هم فرضا به این شکل هست ( همون چیزی که تو سوال شماره 2 پرسیده بودم ):
int list[10] = { 1, 2, 3, ... , 10 );
char s[6] = "Salam";
float f = 1.25;
cout<<main( list, s, f );
این که چطور این پارامتر های ارسالی در قالب اون Prototype اولیه Main قرار میگیرن و سیستم چطور این کارو می کنه بماند؛ قسمت غیر قابل درکش واسه من اینه که چطور در تابع Main از این پارامتر های ورودی استفاده کنیم؟
مثلا در این مثال آرایه list در کدوم خونه از آرایه argv قرار میگیره و نحوه دسترسی به خونه پنجم آرایه list چگونه است؟
amin1softco
چهارشنبه 25 مرداد 1391, 11:03 صبح
خوب کامپایلر می تونه ورودی ها رو به عنوان یک رشته بگیره و با استفاده از فاصله یا اسپیس ها این دو تا آرگومان رو ایجاد کنه
خوب یک حلقه می نویسیم و ازش استفاده می کنیم :
for(int i = 0; i < argc; i++)
{
cout << "argv[" << i << "] = " << argv[i] << endl;
//do something here
}
Sarv 123
چهارشنبه 25 مرداد 1391, 23:47 عصر
Thanks to Mr. amin1softco
متاسفانه من هنوز جای ابهام واسم وجود داره.
در پست شماره 10 من تابع Main رو به این صورت فراخوانی کردم که میدونم اشتباست و فقط جنبه رسوندن منظورم رو داشت:
cout<<main( list, s, f );
که در اینجا list آرایه ای از اعداد صحیح و s یک رشته و f یک عدد اعشاری است.
حالا من میخوام بدونم فرستادن این آرگومان ها به تابع Main از طریق تابع System چطوریه؟
#target
پنج شنبه 26 مرداد 1391, 00:51 صبح
ی راهش اینه که همون آرگومان بفرستی !
ولی بهتره که از حافظه اشتراک بین پردازه ها استفاده کنی
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366551(v=vs.85).aspx
#target
پنج شنبه 26 مرداد 1391, 04:51 صبح
ی چیزی نوشتم شاید بدرد بخوره
این کد مال فایل که قرار systemرو فراخوانی کنه
#include <stdio.h>
int main()
{
char b[100];
int Pointer = 0;
int listsize = 2;
int list[2];
char* s = "Test.String";
float f = 3.14;
Pointer += sprintf(b , "%s" , "C:\\Pr2.exe ");
Pointer += sprintf(&b[Pointer] , "%d " , listsize);
for (int i = 0; i < listsize; i++)
Pointer += sprintf(&b[Pointer] , "%d " , list[i]);
Pointer += sprintf(&b[Pointer] , "%s " , s);
Pointer += sprintf(&b[Pointer] , "%f " , f);
system(b);
}
و اینم که قراره اطلاعاتو بگیره و استفاده کنه . البته استفاده رو باید خودت با توجه به نیاز انجام بدی اینجا من همه رو پرینت کردم !
#include <stdio.h>
int main(int argc, char *argv[])
{
for (int i = 1; i < argc; i++)
printf("%s\n" , argv[i]);
}
Sarv 123
پنج شنبه 26 مرداد 1391, 10:50 صبح
از همه دوستان بسیار ممنونم.
alihatam
یک شنبه 04 خرداد 1393, 11:04 صبح
سلام. لطفا من مبتدی رو ببخشید. به خدا خیلی زحمت می کشم ولی چی کار کنم هنوز مبتدی موندم. این کدی رو که می خوام بزارم یکی از مثال های کتاب جعفرنژاده. با اولین خط بعد از هدر فایل ها مشکل دارم نمی فهمم چیه؟ لطفا راهنمایی بفرمایید:
#include <fstream.h>
#include <iostream.h>
#include <stdlib.h>
#include <conio.h>
int main(int argc, char *argv[])
{
char ch;
int pc, po, bc, bo ;
pc = po = bc = bo = 0;
// clrscr();
if(argc < 2) {
cout << "usage : program filename.";
// getch();
exit(0);
}
ifstream fp(argv[1]);
if(!fp) {
cout << "Cannot open file.";
getch();
exit(0);
}
fp.get(ch);
while(!fp.eof()) {
switch(ch) {
case ')':
pc ++; break;
case '(':
po ++; break;
case '}':
bc ++; break;
case '{' :
bo ++;
}
fp.get(ch);
}
fp.close();
cout << "pc = " << pc << ", po = " << po
<< ", bc = " << bc << ", bo = " << bo;
// getch();
return 0;
}
سلام دوست عزیز ببخشید قصد بی احترامی ندارم ولی فکر میکنم شما مشکل وسواسی دارین به همین دلیل به قول خودتون مبتدی موندین
به نظرم باید وسواسی رو بزارین کنار و وقتی در حاشیه ی بحث چیزی دیدین که ازش سر در نیاوردین بزارین کنار و به خود بحث توجه کنین مطمعن باشین هرجا لازم باشه نویسنده کتاب در مورد اون چیز کامل توضیح میده
البته کتاب های جعفر نژاد هم هرجا چیزی رو بلد نبوده یه مثال از یه کتاب آورده تا مجبور نشه توضیح بده و آدم رو مجبور میکنه وسواس باشه
سایت مکتب خونه دو تا فیلم آموزش برنامه نویسی مقدماتی و پیشرفته داره که مقدماتیه مال دانشگاه صنعتی اصفهان (من کامل نگاش کردم الکی میگن پیشرفته گفته خیلی هم مقدماتی کامل توضیح داده) پیشرفته هم مال دانشگاه صنعتی شریفه
در پناه حق
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.