درخواست کمک فوری برای رفع خطا

a_saeide

New Member
سلام من چند قطعه کد رو اجرا میکنم و همه یه خطا میدن توی همه این قطعه کد ها از لگاریتم استفاده شده و خطای زیر رو میده قسمتی از کد که خطاو یه نمونه از خطا پایین هست
void​
Ready_Task(int RO, int number , double alpha)
{
int i;
random(number ,alpha);
for(i=0;i<number;i++)
{
T.u=T.c/T.p;
T.v=((log10(T.p)/log10(2))- floor((log10(T.p)/log(2))));
T.RO=RO;
}



Error1error C2668: 'log10' : ambiguous call to overloaded function
و یه قطعه کد دیگه هست که 20 خطا میده و همه در مورد توابعی هست که تعریف شده مثل خطای پایین
Error 6error C2601: 'Task_Generation' : local function definitions are illegal
 

the_king

مدیرکل انجمن
سلام من چند قطعه کد رو اجرا میکنم و همه یه خطا میدن توی همه این قطعه کد ها از لگاریتم استفاده شده و خطای زیر رو میده قسمتی از کد که خطاو یه نمونه از خطا پایین هست
Error1error C2668: 'log10' : ambiguous call to overloaded function
و یه قطعه کد دیگه هست که 20 خطا میده و همه در مورد توابعی هست که تعریف شده مثل خطای پایین
Error 6error C2601: 'Task_Generation' : local function definitions are illegal
بعضی از توابع overload شده مثل log10 به عنوان پارامتر ورودی شون چند نوع داده قبول می کنند، مثلا log10 می تواند یک عدد float یا double یا long double را قبول کند.
وقتی شما نوع داده دیگری بغیر از اینها را بکار می برید کامپایلر ناچار به تغییر نوع داده است، اما گاهی چند گزینه برای تبدیل وجود دارد و کامپایلر نمی تواند تشخیص بدهد که
منظور برنامه نویس کدام یکی از انواع overload شده است.

فرضا شما نوشته اید (log10(2 که 2 یک عدد صحیح int است که برای (log10(int یک overload مرتبط وجود ندارد. حالا کامپایلر نمی داند که باید 2 را float یا double یا long double فرض کند.
اینجور مواقع نوع داده را خودتان باید در کد مشخص کنید. فرضا بجای (log10(2 از (log10((double)2 استفاده کنید تا کامپایلر دچار مشکل نشود. اگر نوع داده p هم یکی از سه انواع داده
اعشاری نیست برای T.p بجای (log10(T.p از (log10((double)T.p استفاده کنید.

خطای C2601 نشون میده که تعریف تابع Task_Generation صحیح نیست، فرضا { یا } های اطراف اش به تعداد مناسب نیستند یا موقعیت تعریف شدنش نادرسته.
 

a_saeide

New Member
تشکر و درخواشت راهنمایی

سلام
مرسی بابت کمکتون همون کارو که گفتین نجام دادم ولی دو تا خطا دیگه داد
Error2error LNK2019: unresolved external symbol "double __cdecl power(double,int)" (?power@@YANNH@Z) referenced in function "double __cdecl ln(double)" (?ln@@YANN@Z)

Error 3 error LNK1120: 1 unresolved externals
و مشکل دوم که داشتم چک کردم }{ درست بود این خطا رو برای 28 تابع که تعریف شده میده من توبه رو بعد بسته شدن main نوشتم کردم وقبلشم داخل main تعریفش کردم
 

the_king

مدیرکل انجمن
در تعریف تابع ln تابع power فراخوانی شده. این power کجا تعریف شده؟
 

a_saeide

New Member
تشکر

خیلی لطف کردین این حل شد ولی اون یکی هنوز حل نشده
مثلا به این قطعه کد
void backup_reject(int i,int j,int t_current)
{
for(int i1=t_current;i1<T.Next_deadline;i1++)
{
if(P[j-1].SchArray[i1]==i+1000)
P[j-1].SchArray[i1]=-1;
}
}


Error 25 error C2601: 'backup_reject' : local function definitions are illegal


یا به متغیرهای تعریف شده این کد پایینی خطا میده که تعریف نشده
void Task_Generation(double alpha, int number)
{
cout<<alpha<<
".........."<<number<<"\n";
double r; /* random value in range [0,1) */
long int M; /* user supplied upper boundary */
int n ; /* n denotes index and number of tasks */
double p,c; /* p denotes period that generated and c denotes computation time generated*/
double d ; /* d denotes deadline */
double u ; /* u denotes utilization of task */
double U ; /* U denotes utlization of processor */
double v;
srand((
unsigned) time(NULL)); /*initialize random number generator*/
M =200;
/* Choose M. Upper bound */
U=0;
n=0;
for(int counter=0;counter<number;counter++)
{
r = ( (
double)rand() / (double)(RAND_MAX+1) ); /* r is a random value in the range [0,1) */
p = (r * M);
/* p is a random value in the range [0,M) */
p =(
int) p + 1 ;
if(p>M)
p=M;
d=p;
/* deadline = period */
//r = ( (double)rand() / (double)(RAND_MAX+1) );
c = (double)p*alpha; /* c is a random value in the range [0,M) */
c=(
int)c+1;
u= c/p;
double z=2.0
v=((log10((
double) T[counter].p)/log10(z))- floor((log10((double) T[counter].p)/log10(z))));
Ready_Task( p, d, c, u, v, counter);
}
/* for*/
}

IntelliSense: identifier "v" is undefined
IntelliSense: identifier "m" is undefined
IntelliSense: identifier "r" is undefined
IntelliSense: identifier "p" is undefined
واسه همه متغییراش این خطا رو میده
  Error 2 error C2601: 'Task_Generation' : local function definitions are illegal

IntelliSense: expected a ';' 2
توابع دیگه فقط خطا local function definitions are illegal میدن​
 

the_king

مدیرکل انجمن
کد هایی که قبل از سطر اول (void backup_reject(int i,int j,int t_current نوشته شده رو بررسی کنید. تعداد { ها و } شون با هم برابر باشه.
این توابع یا باید قبل از main نوشته شده باشند و یا بعد از main ، بررسی کنید که داخل خود main قرار نگرفته باشند.
 

a_saeide

New Member
تشکر

مرسی خیلی به من کمک کردین
{ اخر main جا افتاده بود
این برنامه من شبیه ماشین دربو داغون که یه چیزیشو درست میکنی یه چیز دیگه اش خراب میشه
یه سری خطا دیگه هم داشت که با راهنمایی های شما رفعش کردم
ولی دو تا خطا دیگه اومده باز مال تبدیل متغیر هاست
تبدیلش میکنم میشه چهارتا خطا


struct Processor1{
int N; //Number of Task that assign to this processor
double U; // Total Utilization of Processor
int list[1000]; // List of Task that assign to this processor
double Sm; // reqiured for ST and GT and GT/M
double BF; // reqiered for BF algorithm
long SchArray [1500];
int t_processorFault[1000];
}P[1500],Q[100][1500];


void initial_Processors(long int lcm)
{
for(int j=0;j<2000;j++)
{
int k;
P[j].U=0;
P[j].N=0;
for(k=0;k<1000; k++)
P[j].list[k]=-1;
P[j].SchArray=
new int [lcm];
for(int i=0;i<lcm;i++)
P[j].SchArray=-1;
}
}




خطاهایی که میده این دو تاس
Error 5 error C2440: '=' : cannot convert from 'int *' to 'long [1500]'
IntelliSense: expression must be a modifiable lvalue

 

the_king

مدیرکل انجمن
مرسی خیلی به من کمک کردین
{ اخر main جا افتاده بود
این برنامه من شبیه ماشین دربو داغون که یه چیزیشو درست میکنی یه چیز دیگه اش خراب میشه
یه سری خطا دیگه هم داشت که با راهنمایی های شما رفعش کردم
ولی دو تا خطا دیگه اومده باز مال تبدیل متغیر هاست
تبدیلش میکنم میشه چهارتا خطا

خطاهایی که میده این دو تاس

Error 5 error C2440: '=' : cannot convert from 'int *' to 'long [1500]'
IntelliSense: expression must be a modifiable lvalue

این تعریف یک آرایه با طول ثابت ئه :
کد:
long SchArray [1500];
و SchArray با این تعریف همیشه طول اش 1500 است، حافظه اش از ابتدا تخصیص داده میشه و قابل جابجایی و تغییر اندازه نیست.
ولی وقتی شما از کد زیر استفاده می کنید، به یک اشاره گر SchArray نیاز دارید که مقدارش قابل تغییر باشه :
کد:
 P[j].SchArray= new int [lcm];

یعنی بجای اون تعریف ;[long SchArray [1500 فقط باید یک اشاره گر تعریف کنید، نه آرایه :
کد:
long *SchArray;

در ضمن نوع داده هایی که مشخص کرده اید با هم همخوانی نداره، فرضا آرایه SchArray از نوع long است، اما موقع مقدار دهی از [new int [lcm استفاده کرده اید.
lcm رو longint تعریف کرده اید، بعد داخل حلقه for که قراره lcm بار اجرا بشه متغیر i رو int تعریف کرده اید.
 

a_saeide

New Member
تشکر

سلام مرسی واقعا به من کمک کردین من خیلی از مشکلام حل شد چند قدم تو کارم جلو رفتم چند تا از برنامه هایی که داشتم درست شد
ولی اخرش این برنامه با اینکه اجرا شد ولی خروجی نداده قطع میشه
 

the_king

مدیرکل انجمن
سلام مرسی واقعا به من کمک کردین من خیلی از مشکلام حل شد چند قدم تو کارم جلو رفتم چند تا از برنامه هایی که داشتم درست شد
ولی اخرش این برنامه با اینکه اجرا شد ولی خروجی نداده قطع میشه

با اینکه ()getch یک تابع استاندار در زبان ++C / C نیست اغلب کامپایلر ها ازش پشتیبانی می کنند، ابتدای کد ها تون conio.h رو include کنید و در انتهای main
و پیش از دستور return تابع getch رو فراخوانی کنید :
کد:
#include <conio.h>
.
.
.
int main()
{
	.
	.
	.
	getch();
	return 0;
}
 

a_saeide

New Member
تابع mainاز نوع void صفحه کنسول باز میشه بعد یه کادر جدید باز میشه که این توش نوشته
Unhandled exception at 0x011f3bbd in rm.exe: 0xC0000005: Access violation reading location 0x00adfffc.
دو تا گزینه داره break که میزنم قطع میشه و continu که هرچی میزنم باز همون پیغام میاد
 

the_king

مدیرکل انجمن
تابع mainاز نوع void صفحه کنسول باز میشه بعد یه کادر جدید باز میشه که این توش نوشته
Unhandled exception at 0x011f3bbd in rm.exe: 0xC0000005: Access violation reading location 0x00adfffc.
دو تا گزینه داره break که میزنم قطع میشه و continu که هرچی میزنم باز همون پیغام میاد

از )void main استفاده نکنید، استاندارد نیست، )int main رو بکار ببرید و انتهای کد main یک ;return 0 اضافه کنید.
اگه خطا همچنان پابرجا باشه یا ایراد از کامپایلر ئه یا عدم سازگاری با سیستم عامل یا ارسال آدرس حافظه نامعتبر در توابع برنامه تون.
 

a_saeide

New Member
سوال

کاری که گفتین انجام دادم ولی جواب نداد وقتی تریس می کنم ایراد برنامه تو این if هست داخل این تابع که توی یه تابع دیگه فراخوانی شده
void Update_Processor(int i,int j)
{
P[j].U=P[j].U+T.u;
// Uj=Uj+ui
P[j].N=P[j].N+1; // N=N+1
P[j].list[P[j].N-1]=i;
T.corrVerProcessorIndex=j+1;
T[1000+i].corrVerProcessorIndex=j;
//Schedule Backups in Next Processor
int timePointer=T.p-1, periodTimePointer=T.p-1;
int assignCounter=T.c;
while(periodTimePointer<LCM)
{
:-?if(P[j-1].SchArray[timePointer]==-1)
{
P[j-1].SchArray[timePointer]=1000+i;
assignCounter--;
timePointer--;
}

//if
else
{
timePointer--;
}
/*if(timePointer==periodTimePointer-T.p && assignCounter>1)
{
cout<<"\nNot SchedulableTask: "<<i<<"****"<<T.p<<"*****"<<T.c<<"******"<<timePointer;
}*/
if(assignCounter==0)
{
periodTimePointer=periodTimePointer+T.p;
timePointer=periodTimePointer;
assignCounter=T.c;
}
}
//while
}

این هم تابعی که توش فراخوانی شده

int assignTaskToProessors(int n)
{
//int RO; // Redundancy Order of Task

int i; // i denotes the ith task

int j; // j denotes index of processor

int m; // m the number of processors allocate

int ok; // ok denotes if this processor schedule this task

int PO; // PO denotes PO condition

int l,k,temp;
int index_task[1000];

//-----------

for(l=0 ; l<n ; l++)
index_task[l]=l;
for( l=0; l<n; l++)
{
for(k=0;k<n-1; k++)
if( T[index_task[k+1]].v < T[index_task[k]].v)
{
temp=index_task[k];
index_task[k]=index_task[k+1];
index_task[k+1]=temp;
}
}
 

//-----------

m=1;
//j=1;

for ( l=0 ; l<n ; l++ )
{
i=index_task[l];
if(T[l].p>=max_period)
max_period=T[l].p;
for (j=1;; j++ )
{
//cout<<"j="<<j<<"\n";

ok=Pre_assign(i,j);
PO=PO_Condition(i,j);
if ( ok==1 && PO==1)
break;
}
// the processor index that schedule the task are identifed

if(j>m)
m=j;
Update_Processor(i,j);
// i denotes ith task , j denotes index the processor

}
return (m+1);
}
 

a_saeide

New Member
سوال

کاری که گفتین انجام دادم ولی جواب نداد وقتی تریس می کنم ایراد برنامه تو این if هست داخل این تابع که توی یه تابع دیگه فراخوانی شده
void Update_Processor(int i,int j)
{
P[j].U=P[j].U+T.u;
// Uj=Uj+ui
P[j].N=P[j].N+1; // N=N+1
P[j].list[P[j].N-1]=i;
T.corrVerProcessorIndex=j+1;
T[1000+i].corrVerProcessorIndex=j;
//Schedule Backups in Next Processor
int timePointer=T.p-1, periodTimePointer=T.p-1;
int assignCounter=T.c;
while(periodTimePointer<LCM)
{
:-?if(P[j-1].SchArray[timePointer]==-1)
{
P[j-1].SchArray[timePointer]=1000+i;
assignCounter--;
timePointer--;
}

//if
else
{
timePointer--;
}
/*if(timePointer==periodTimePointer-T.p && assignCounter>1)
{
cout<<"\nNot SchedulableTask: "<<i<<"****"<<T.p<<"*****"<<T.c<<"******"<<timePointer;
}*/
if(assignCounter==0)
{
periodTimePointer=periodTimePointer+T.p;
timePointer=periodTimePointer;
assignCounter=T.c;
}
}
//while
}

این هم تابعی که توش فراخوانی شده

int assignTaskToProessors(int n)
{
//int RO; // Redundancy Order of Task

int i; // i denotes the ith task

int j; // j denotes index of processor

int m; // m the number of processors allocate

int ok; // ok denotes if this processor schedule this task

int PO; // PO denotes PO condition

int l,k,temp;
int index_task[1000];

//-----------

for(l=0 ; l<n ; l++)
index_task[l]=l;
for( l=0; l<n; l++)
{
for(k=0;k<n-1; k++)
if( T[index_task[k+1]].v < T[index_task[k]].v)
{
temp=index_task[k];
index_task[k]=index_task[k+1];
index_task[k+1]=temp;
}
}
 

//-----------

m=1;
//j=1;

for ( l=0 ; l<n ; l++ )
{
i=index_task[l];
if(T[l].p>=max_period)
max_period=T[l].p;
for (j=1;; j++ )
{
//cout<<"j="<<j<<"\n";

ok=Pre_assign(i,j);
PO=PO_Condition(i,j);
if ( ok==1 && PO==1)
break;
}
// the processor index that schedule the task are identifed

if(j>m)
m=j;
Update_Processor(i,j);
// i denotes ith task , j denotes index the processor

}
return (m+1);
}
 

the_king

مدیرکل انجمن
بدیهی یه که هر جا که از آرایه استفاده می کنید مقداری که بین [ ] نوشته میشه باید در محدوده قابل قبول 0 الی n - 1 باشه که n طول آرایه است.
اگر در جایی از کدتون این اندیس کمتر از 0 یا بیشتر از n - 1 بشه، آدرس حافظه ای بدست میاد که از محدوده حافظه تخصیص داده شده خارجه.
کامپایلر این مساله رو بررسی نمی کنه اما موقع اجرای کد به دلیل عدم امکان دسترسی به اون بخش از حافظه خطا پیش میاد.
کار وقت گیری ئه اما باید سطر به سطر کد مشکوک رو بررسی کنید، یک جایی از کد مقداری رو به عنوان اندیس آرایه در نظر می گیره که در
محدوده قابل قبول (با توجه به اندازه آرایه) نیست.
 

a_saeide

New Member
درخواست

من واقعا این برنامه رو احتیاج دارم که اجرا بشه از دیروزم دارم روش کار میکنم درس نمیشه

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

a_saeide

New Member
سوال

سلام اگه بخوام یه تابع تعریف کنم که از بین 3 عدد یکی رو رندم انتخاب کنه چی باید بنویسم
 

the_king

مدیرکل انجمن
سلام اگه بخوام یه تابع تعریف کنم که از بین 3 عدد یکی رو رندم انتخاب کنه چی باید بنویسم

سوالاتی که مربوط به موضوع اصلی این تاپیک نمیشه رو در یک تاپیک جدید مطرح کنید.

اعداد تصادفی توسط تابع ()rand بدست میاد که یک عدد صحیح نامنفی است. از عملگر باقیمانده تقسیم صحیح (%) استفاده می کنند تا به یک بازه خاص محدود بشه،
فرضا rand() % 3 یک عدد صحیح نامنفی کمتر از 3 رو ایجاد می کنه، یعنی یکی از اعداد 0 و 1 و 2

کد:
double MyRandom(double a, double b, double c)
{
    switch (rand() % 3)
    {
        case 0:
            return a;
        case 1:
            return b;
        default:
            return c;
    }
}

بصورت پیشفرض ()rand همیشه موقع اجرای کد یکسری اعداد تصادفی رو ایجاد می کنه که با دفعات اجرای قبلی فرقی نمی کنه. (مقدار seed شروع کننده اش ثابته)
تابع ()srand مقدار seed تابع ()rand را تنظیم می کند. برای تصادفی کردن مقدار seed معمولا از تایمر سیستم استفاده می کنند. یکبار اجرای این کد در ابتدای برنامه کفایت می کند :
کد:
int main()
{
    srand (time(NULL));

اضافه کردن دو کتابخانه stdlib و time برای دسترسی به ()rand و ()srand و ()time لازم است.
کد:
#include <stdlib.h>
#include <time.h>

کد:
#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;

double MyRandom(double a, double b, double c)
{
    switch (rand() % 3)
    {
        case 0:
            return a;
        case 1:
            return b;
        default:
            return c;
    }
}

int main()
{
    srand (time(NULL));
    cout << MyRandom(7, 12, 35) << endl;
    return 0;
}
 

جدیدترین ارسال ها

بالا