[問題] C回傳陣列指標

看板C_and_CPP (C/C++)作者時間16年前 (2009/04/26 16:06), 編輯推噓2(208)
留言10則, 2人參與, 最新討論串1/1
我寫一個簡單的要算2元一次方程式的程式 用一個函式來解出s,t的值,但我想把2個答案的陣列回傳出來 所以solve_funct函式回傳的是指標的位址 但我在main函式中從這個位址去讀值有點問題 想請問一下觀念是錯在哪裡 以下是我的程式碼 #include <stdlib.h> #include <stdio.h> #include <math.h> #include <iostream> // func.s是未知數s的係數a1 func.t是未知數t的係數, c是常數 // a1*s + a2*t - c = 0 typedef struct func { float s; float t; float c; }func; // 解 det of matrix float det(float a, float b, float c, float d){ float ans; ans = a*d - c*b; return ans; } // solve the intersection point for 2D plane float* solve_funct(func f1,func f2){ float ans[2]; float a1,a2,a3; a1 = det(f1.s,f1.t,f2.s,f2.t); a2 = det(-f1.c,f1.t,-f2.c,f2.t); a3 = det(f1.s,-f1.c,f2.s,-f2.c); ans[0] = a2/a1; ans[1] = a3/a1; std::cout<<&ans<<"\n"; return &ans[0]; } void main(){ // test solve func f1,f2; f1.s = 1; f1.t = 1; f1.c = -1; f2.s = 1; f2.t = -1; f2.c = -1; float *ans; ans = solve_funct(f1,f2); std::cout<<*(ans+0); //s解 但是這邊印出來的不是函式解出來的值.. std::cout<<*(ans+1); //t解 } 感謝您的耐心 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 76.180.212.189

04/26 16:32, , 1F
副程式結束時, 其中宣告的區域變數就跟著說再見了,
04/26 16:32, 1F

04/26 16:32, , 2F
所以你回傳的指標回到主程式根本就不曉得內容會怎樣.
04/26 16:32, 2F

04/26 16:33, , 3F
一個作法是, 在主程式宣告空間, 然後把指標傳進副程式.
04/26 16:33, 3F

04/26 16:33, , 4F
這樣副程式直接把結果寫到該位址去就可以了.
04/26 16:33, 4F

04/26 16:33, , 5F
另一個方法是副程式用new/malloc這一塊空間, 這樣就可
04/26 16:33, 5F

04/26 16:34, , 6F
直接傳位址回去, 只是主程式讀完要記得delete/free.
04/26 16:34, 6F

04/26 16:34, , 7F
若是考慮成對coding style, 後面這樣做可能比較不好:)
04/26 16:34, 7F

04/26 16:50, , 8F
喔喔喔~~ 原來是區域跟全域變數的問題XD 謝謝!!!
04/26 16:50, 8F

04/26 17:35, , 9F
啊對~~還有另一個也很常見的方法就想你說的開全域變數.
04/26 17:35, 9F

04/26 17:35, , 10F
只是開全域變數的另一個代價是可能增加debug的困難度XD
04/26 17:35, 10F
文章代碼(AID): #19z1ON4v (C_and_CPP)
文章代碼(AID): #19z1ON4v (C_and_CPP)