PDA

View Full Version : سوال: نحوه حل مشکل همنام شدن متغییر های داخل توابع با متغییر های سراسری؟



md3848
سه شنبه 12 مرداد 1395, 21:45 عصر
سلام - این مشکلی هستش که منو یکم اذیت میکنه - دوستان از چه شیوه نام گزاری استفاده میکنن؟ آیا استانداردی در شیوه نام گزاری متغییرهای سراسری(Global) و متغییر هایی که داخل توابع تعریف شدن(Local) وجود داره؟ و اصلا این که شما خودتون این مشکل رو چطور حل میکنید؟

چون بعضا برام رخ داده که متغییر های با لوکال هم نام شدن و این یکم اذیت میکنه، البته درسته که داخل تابع،بین دو متغییر همنام، متغییر لوکال در نظر گرفته میشه و نه متغییر سراسری، ولی خب این این موضوع یکم اذیت میکنه و بعضا باعث اشتباه من میشه.

ممنون میشم دوستان راهنمایی کنن.

AliAskari1375
چهارشنبه 13 مرداد 1395, 02:15 صبح
سلام

هر جایی از برنامتون که همچین مشکلی پیش اومد، برای اینکه به کمپایلر بگید منظورتون از متغیر، اون متغیر global هست و نه متغیر محلی، کافیه قبل از اسم متغیر علامت :: بذارید. اینطوری


int num = 0;


void print()
{
int num = 34;
::num = 100; // global variable by name 'num'
cout << num << endl; // will print 34
}

1-9-7-2
چهارشنبه 13 مرداد 1395, 02:18 صبح
#include <stdlib.h>
#include <stdio.h>

int var = 157;

int var_A (void);
int var_B (void);
int var_C (void);

int main () {
printf ("Global var> %d\n", var);

int var = 812;

printf ("Local var> %d\n\n", var);

printf ("Local var> %d\nGlobal var> %d\n\n", var_A(), var_B());

printf ("var> %d + var> %d = ", var, var);

printf ("var>> %d\n\n", var+=var);

printf ("Global var> %d\n", var_B());
printf ("Global var>> %d\n\n", var_C());

printf ("Local var> %d\n", var);
printf ("Global var> %d\n", var_B());

return (EXIT_SUCCESS);
}

int var_A (void) {
int var = 56;
return (var);
}

int var_B (void) {
return (var);
}

int var_C (void) {
return (var+=var_B());
}


141827

pe32_64
چهارشنبه 13 مرداد 1395, 20:57 عصر
سلام

هر جایی از برنامتون که همچین مشکلی پیش اومد، برای اینکه به کمپایلر بگید منظورتون از متغیر، اون متغیر global هست و نه متغیر محلی، کافیه قبل از اسم متغیر علامت :: بذارید. اینطوری


int num = 0;


void print()
{
int num = 34;
::num = 100; // global variable by name 'num'
cout << num << endl; // will print 34
}

البته این مخصوص c++ هست.در c باید اسم رو تغییر داد.
مثلا با پیشوند g.یا همه دریک struct باشن و ... .

md3848
چهارشنبه 13 مرداد 1395, 22:20 عصر
ممنون از شما دوستان
ولی خب همون طور که دوستمون(1972) هم گفتن، و خودم هم تو پست اول خدمتتون ذکر کردم،


البته درسته که داخل تابع،بین دو متغییر همنام، متغییر لوکال در نظر گرفته میشه و نه متغییر سراسری

ولی خب حالت خوب اینه که داخل اون تابع متغییر همنام متغییر سراسری رو تعریف کرده باشی
ولی حالت بد که ممکنه خیلی اضیت کنه اینه که داخل تابع متغییر لوکال همنام متغییر سراسری رو یادت بره تعریف کنی و کامپایلر هم ارروری و وارنینگی هم نمیده و ما هم متوجه نمیشیم و بعد میبینیم برنامه کار نمیکنه، حالا مگه میشه مشکل رو پیدا کرد، بعضا هم ظرر مالی میبینم از این بابت(چون با سخت افزار کار میکنم و برنامه تحت سیستم عامل نمینویسم-بگذریم...)

به نظرم اگه از فرمت استاندارد نام گزاری این جور متغییر ها رو رعایت کنم بهترین حالت باشه
اصلا همچین فرمت استانداردی برای نام گزاری متغییر ها وجود داره؟

کلا این نام گزاری متغییر ها، کلاس ها، اشیا، ساختارها، توابع و.... رو اگه کسی شیوه درستش رو بگه ممنون میشم.
مثلا برای اشیا من خودم برای این که متوجه بشم یه obj ته نام شی قرار میدم - حالا نمیدونم برنامه نویسای حرفه ای همین کارو میکنن یا کار دیگه ای

filafila
پنج شنبه 14 مرداد 1395, 10:01 صبح
اگر به دلایلی کامپایلر ما :: را قبول نکرد چه راه حلی برای اینکه این دو متغیر همنام با هم اشتباه نشوند وجود دارد؟
این راه حلتون را توضیح میدهید؟
کد من برای این مساله چند روزه منو سرکار گذاشته و من هم نیاز به پاس دادن تحت آرگومان متغیر سراسری دارم و هم اینکه نیاز دارم در جایی روی اون داخل برنامه کار کنم؟
راه حل که هر بار که تابع داخلی بازگشتی صدا زده میشه آرگومان با متغیر محلی ریست نشه و به عنوان متغیر سراسری پنداشته بشه؟؟
من مشکلم این است که counterpath هر بار به صفر ریست میشه در حالی که من میخواهم هر بار تغییر کند و اوررایت نکند؟ راه حل؟
counterpath, counterelempath, nodeمتغیرهای سراسری هستند.




(void findpath(int node, int counterpath, int counterelempath
}
(if(numvisitedleaves==numofleaves
return;
Paths[counterpath][counterelempath]=node;

((if((node->rightchild==MAXNUMINFI) && (node->leftchild==MAXNUMINFI
}
;(addpath(counterelempath
++counterpath;// one path=one leaf is found go to next leaf=path
;++numvisitedleaves
{
else
}
; ++counterelempath
; (findpath(node->leftchild,counterpath,counterelempath
; (findpath(node->rightchild,counterpath,counterelempath
{

البته این مخصوص C++‎‎‎ هست.در c باید اسم رو تغییر داد.
مثلا با پیشوند g.یا همه دریک struct باشن و ... .

mohammad0773
پنج شنبه 14 مرداد 1395, 22:07 عصر
سلام
برای جلوگیری از تداخل نام متغیر ها،کلاسها،توابع و... namespace مطرح میشه.در هر فضای نامی میتونید متغیر اعلام کنید و به اون ها دسترسی داشته باشید.یه مثال نچنداد جالب:

namespace Rmotor{
bool power;
}
namespace Lmotor{
bool power;
}namespace Rmotor{
bool power;
}
namespace Lmotor{
bool power;
}
bool power;
int main()
{
power=true;
Lmotor::power=true;
Rmotor::power=false;
std::cout<<"right motor:"<<Rmotor::power<<"\nLeftmotor:"<<Lmotor::power<<"\nRobat:"<<power;
return 0;
}
فضای نام رو با کلاس اشتباه نگیرید!
یه لینک خوب :http://www.hpkclasses.ir/Courses/cpp/cpp1500.html

pe32_64
پنج شنبه 14 مرداد 1395, 23:05 عصر
اگر به دلایلی کامپایلر ما :: را قبول نکرد چه راه حلی برای اینکه این دو متغیر همنام با هم اشتباه نشوند وجود دارد؟
این راه حلتون را توضیح میدهید؟
کد من برای این مساله چند روزه منو سرکار گذاشته و من هم نیاز به پاس دادن تحت آرگومان متغیر سراسری دارم و هم اینکه نیاز دارم در جایی روی اون داخل برنامه کار کنم؟
راه حل که هر بار که تابع داخلی بازگشتی صدا زده میشه آرگومان با متغیر محلی ریست نشه و به عنوان متغیر سراسری پنداشته بشه؟؟
من مشکلم این است که counterpath هر بار به صفر ریست میشه در حالی که من میخواهم هر بار تغییر کند و اوررایت نکند؟ راه حل؟
counterpath, counterelempath, nodeمتغیرهای سراسری هستند.




(void findpath(int node, int counterpath, int counterelempath
}
(if(numvisitedleaves==numofleaves
return;
Paths[counterpath][counterelempath]=node;

((if((node->rightchild==MAXNUMINFI) && (node->leftchild==MAXNUMINFI
}
;(addpath(counterelempath
++counterpath;// one path=one leaf is found go to next leaf=path
;++numvisitedleaves
{
else
}
; ++counterelempath
; (findpath(node->leftchild,counterpath,counterelempath
; (findpath(node->rightchild,counterpath,counterelempath
{

بهترین راه تغییر نام هستش

filafila
پنج شنبه 14 مرداد 1395, 23:29 عصر
ممنون دوست عزیز اما مشگل من حل نشده متاسفانه. من چون میام محلی میذارم چون این قسمت بازگشتی صدا زده میشه بقیه را از دست میده و میاد روی سطر 0 همه Pathsرا میریزه


سلام
برای جلوگیری از تداخل نام متغیر ها،کلاسها،توابع و... namespace مطرح میشه.در هر فضای نامی میتونید متغیر اعلام کنید و به اون ها دسترسی داشته باشید.یه مثال نچنداد جالب:

namespace Rmotor{
bool power;
}
namespace Lmotor{
bool power;
}namespace Rmotor{
bool power;
}
namespace Lmotor{
bool power;
}
bool power;
int main()
{
power=true;
Lmotor::power=true;
Rmotor::power=false;
std::cout<<"right motor:"<<Rmotor::power<<"\nLeftmotor:"<<Lmotor::power<<"\nRobat:"<<power;
return 0;
}
فضای نام رو با کلاس اشتباه نگیرید!
یه لینک خوب :http://www.hpkclasses.ir/Courses/cpp/cpp1500.html

filafila
جمعه 15 مرداد 1395, 02:15 صبح
متاسفانه با تغییرنام هم حل نشد
بهترین راه تغییر نام هستش