鐵之狂傲

 取回密碼
 註冊
搜尋

切換到指定樓層
1#
10鐵幣
#include
#include
#define M 10
typedef struct lp
{
float x;
int num;
struct lp *next;
}LP;

int main(void)
{
LP *Z,*lim[M],*p;
int v,i,j,n,k,count=1;
float val[M];
p=Z;
printf("請輸入最大值函數的變數數目(此後,會將變數名稱依序編號為x1,x2,...): ");
scanf("%d",&v);

for(i=1;i<=v;i++)
{
p->next=(LP *)malloc(sizeof(LP));
p=p->next;
}
p->next=NULL;
p=Z->next;
for(i=1;i<=v;i++)
{
printf("請輸入x%d變數的係數: ",i);
scanf("%f",&p->x);
p->num=i;
p=p->next;
}

printf("請輸入限制式的數目(最多%d個): ",M);
scanf("%d",&n);

for(i=0;i<N;I++)
{
p=lim;
printf("請輸入第%d個限制式的變數數目: ",i+1);
scanf("%d",&k);
for(j=1;j<=k;j++)
{
p->next=(LP *)malloc(sizeof(LP)); <---問題癥結點
p=p->next;
}
p->next=NULL;
p=lim->next;
while(j<=k&&count<=n)
{
printf("請輸入此限制式x%d變數的係數(若無,請輸入數字0): ",count);
scanf("%f",&p->x);

if(p->x!=0.0f)
{
p->num=count;
p=p->next;
count++;
}
}
printf("請輸入此限制式的最大值: ");
scanf("%f",&val);
}
p=Z->next;
printf("你所輸入的最大值函數為Z=");
while(p!=NULL)
{
printf("%f*x%d",p->x,p->num);
if(p->next!=NULL)
printf("+");
p=p->next;
}
printf("\n\n");
printf("限制式為\n");
for(i=0;i<N;I++)
{
p=lim->next;
while(p!=NULL)
{
printf("%f*x%d",p->x,p->num);
if(p->next!=NULL)
printf("+");
p=p->next;
}
printf("≦%f",val);
printf("\n");
}
system("PAUSE");
return 0;
}

這是我要寫來跑線性規劃用的程式,可是在剛寫的出頭就馬上遇到麻煩
我紅色所指的地方,就是當我編譯完執行後有問題的地方
我用過編譯器檢查,的確執行到那邊就發生問題
可我檢查了老半天就是想不到是哪邊錯了
請程式高手幫忙檢查一下是哪邊出現BUG?

引用的程式有些東西被去掉了,例如陣列的[]
所以我上傳了筆記本檔,下載下來可以看詳細

[ 本文最後由 傲月光希 於 08-5-15 06:35 PM 編輯 ]

bug.rar

781 Bytes, 下載次數: 85, 下載積分: 鐵幣 -5 元

 
進入數學版  滿月祭III相簿1  2
轉播0 分享0 收藏0

回覆 使用道具 檢舉

這個程式有不少的問題存在
我想你在貼文時可能是用從新鍵入的方式
有些變數的名稱跑掉而了
問題主要出在於你只定義了一個指標的容器,而沒有給予實體的記憶體
for(i=1;i<=v;i++)
{
p->next=(LP *)malloc(sizeof(LP));
p=p->next;
}

基本上不用到那麼後面,在這行就有問題了
沒有實體的記憶體,所以程式應該會給予一個溢位的錯誤
只要宣告給p一個實體的記憶體就可以解決了
 
No more thinking, just follow your feeling to dance your hand

回覆 使用道具 檢舉

原文由 PoorCat0919 於 08-5-15 07:04 PM 發表 [原文]
這個程式有不少的問題存在
我想你在貼文時可能是用從新鍵入的方式
有些變數的名稱跑掉而了
問題主要出在於你只定義了一個指標的容器,而沒有給予實體的記憶體
for(i=1;inext=(LP *)malloc(sizeof(LP));
p=p->next;
}

...

我已經有夾帶一個檔案了,那裡面是完整的程式碼
用MALLOC函數不算是給一個記憶體給指標嗎?
那為什麼你說有問題的地方,編譯後沒問題,但是我所指的地方就出問題了?
抱歉,我還是不太懂你的意思
 

回覆 使用道具 檢舉

抱歉, 因為假期的關係, 所以回的很慢

我指的意思是說, 指標在計算機中只是一個單純存放位址的記憶體, 而對應的記憶體
位址必須有相對的內容, 簡單的說就只跟系統說有有個東西放在, 但不知道是什麼東西

解決的方式很簡單
LP *p =(LP *)malloc(sizeof(LP));

在這一行同時宣告了一個p指標, 必給了明確的存放空間
與LP *p;是有很大的差別在
 

回覆 使用道具 檢舉

我說傲月大你之所以會出錯的原因是用到未宣告的記憶體空間了
也就是你的linked list建立的有缺陷
首先看看你的這段代碼
LP *Z,*lim[M],*p;
  int v,i,j,n,k,count=1;
  float val[M];
  p=Z; //在此你的p和Z都非指向一個合法的記憶體空間
  printf("請輸入最大值函數的變數數目(此後,會將變數名稱依序編號為x1,x2,...): ");
  scanf("%d",&v);
  
  for(i=1;i<=v;i++)
  {
    //一個不合法的記憶體空間你還使用它取提取next這一步根本就是錯誤了
    //所以如果會在這裡當掉也不例外
    p->next=(LP *)malloc(sizeof(LP));
    p=p->next;
  }
  p->next=NULL;
  p=Z->next; //這裡也是犯了同樣的問題,Z都尚未指向一個合法的記憶體空間,你又去叫用它的next

你整支程式都一直在犯這樣的錯
如果你可以再提供一些資測檔或想法或許我就有辦法修正
以上!

[ 本文章最後由 turnX 於 08-6-19 08:22 編輯 ]

回覆 使用道具 檢舉

你需要登入後才可以回覆 登入 | 註冊

存檔|手機版|聯絡我們|新聞提供|鐵之狂傲

GMT+8, 24-10-2 06:25 , Processed in 7.238124 second(s), 17 queries , Gzip On.

回頂部