久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2226|回復: 14
收起左側

C語言代碼中,能否有兩個返回值?

[復制鏈接]
ID:624769 發表于 2021-11-17 16:24 | 顯示全部樓層 |閱讀模式
  比如一個子函數
char  TEST();
{
      char  a;
      a++;
      return a;
}

主程序中,  temp = Test();      就能取到 0x01

又比如:
bit  TEST2();
{
      bit  Flag;
      Flag = !Flag;
      return Flag;
}

主程序中,  temp_Flag = Test2();      就能取到 1

那么,能不能做一個子函數,同時返回一個 char 和 一個 bit  如果能的話,函數應該如何聲明,主程序又該如何調用?

望知道的兄弟不吝賜教。
如果,明確確定不能實現,也望告知一下,我也就不浪費時間捉摸了。
回復

使用道具 舉報

ID:824490 發表于 2021-11-17 17:20 | 顯示全部樓層
返回用結構體,多少個都行。
回復

使用道具 舉報

ID:155507 發表于 2021-11-17 20:18 | 顯示全部樓層
return 語句可以有多個,可以出現在函數體的任意位置,但是每次調用函數只能有一個 return 語句被執行,所以只有一個返回值


函數多個參數傳遞方式:地址傳遞

void Exchg2(int *px, int *py)
{
   int tmp = *px;
   *px = *py;
   *py = tmp;
   printf("*px = %d, *py = %d.\n", *px, *py);
}
main()
{
   int a = 4;
   int b = 6;
   Exchg2(&a, &b);
   printf("a = %d, b = %d.\n”, a, b);
   return(0);
}
它的輸出結果是:
*px = 6, *py = 4.
a = 6, b = 4.
看函數的接口部分:Exchg2(int *px, int *py),請注意:參數px、py都是指針。再看調用處:Exchg2(&a, &b);
它將a的地址(&a)代入到px,b的地址(&b)代入到py。同上面的值傳遞一樣,函數調用時作了兩個隱含的操作:將&a,&b的值賦值給了px、py。
   px = &a;
   py = &b;
呵呵!我們發現,其實它與值傳遞并沒有什么不同,只不過這里是將a、b的地址值傳遞給了px、py,而不是傳遞的a、b的內容,而(請好好地在比較比較啦)整個Exchg2函數調用是如下執行的:
   px = &a; /* ← */
   py = &b; /* ← 請注意這兩行,它是調用Exchg2的隱含動作。*/
   int tmp = *px;
   *px = *py;
   *py = tmp;
   printf("*px =%d, *py = %d.\n", *px, *py);
這樣,有了頭兩行的隱含賦值操作。我們現在已經可以看出,指針px、py的值已經分別是a、b變量的地址值了。接下來,對*px、*py的操作當然也就是對a、b變量本身的操作了。所以函數里頭的交換就是對a、b值的交換了,這就是所謂的地址傳遞(傳遞a、b的地址給了px、py),你現在明白了嗎?

回復

使用道具 舉報

ID:57657 發表于 2021-11-17 20:22 | 顯示全部樓層
函數可以修改參數變量(數組)的值,需熟練指針操作。
回復

使用道具 舉報

ID:213173 發表于 2021-11-17 21:24 | 顯示全部樓層
可以有多個,但只能返回其中一個。
回復

使用道具 舉報

ID:624769 發表于 2021-11-17 22:33 | 顯示全部樓層
angmall 發表于 2021-11-17 20:18
return 語句可以有多個,可以出現在函數體的任意位置,但是每次調用函數只能有一個 return 語句被執行,所 ...

謝謝你的回答, 最近為了提高自己對C的理解,在重溫以及改寫以前的代碼,由于這個傳參問題當初也不知道黑51論壇,當初就是用的傳指針方法。
但是傳指針牽涉到指針類型什么的,所以當時為了考慮通用問題,都是用的通用指針 void *p, 所以給編譯后的程序體積帶來很大的負擔。所以才想通過寄存器傳參的方法,由于實際上子函數多是用匯編寫的,所以其實無論是BYTE, 還是 BIT 其實都已經傳到寄存器了,問題就是用在C語言中如何接收傳出來的參。之前用比較變通的方法,先用一個  char Text(); 來接收存在R7的參, 再跟一個 Flag = CY; 把存在C的BIT參也讀出來,感覺總不是很好,所以捉摸是不是可以有更好的辦法。

看你指針說了那么多,想來應該指針這塊比較了解,我也正好有指針問題相當疑惑,這里想請教一下,希望不吝賜教。
1) 當我聲明一個   數組:  char data test_A[8]; 的時候,
函數, void test1(char *p)    應該是可以傳  &test_A 的。
但是, 當我聲明, 數組  char xdata test_B[8];  的時候,
函數, void  test2(這里怎么寫?)   才能傳 &test_B  ?
然后, 當我聲明, 數組  char pdata test_C[8];  的時候,
函數, void  test3(這里怎么寫?)   才能傳 &test_C  ?

而,如果要強制用 上面 test2 函數 傳 &test_C  又該在調用的時候怎么寫?

2)我要聲明一個指針  *p  指向 xdata 的話。
那么, char xdata *p 應該對的吧? 這種情況下 p 應該是雙字節吧?畢竟xdata 地址是雙字節吧? 而*p 應該是單字節的吧? 那么我在使用過程中,如果要讓 *p 變成雙字節, 這個強制轉換應該怎么寫?

暫時,想請教這兩個問題,把指針稍微屢出一點頭緒,后續可能還會追問,希望不要嫌棄。
對指針實在是很多不理解,所以很多時候都寧可不用指針,而用數組。
回復

使用道具 舉報

ID:401564 發表于 2021-11-17 23:49 | 顯示全部樓層
沙發已經告訴你了,用結構體可以返回多個數據類型,N個!結構體還有一個好處,就是復制,數據A的數據如果要復制到數組B的話,是不能B=A的,是有點麻煩的
但結構體可以直接用  B=A;
bit是,位不能作為結構體成員,別的單片機不知道,至少8051是不行的,但可以用一個char 來代替的,速度和代碼空間變化不大
不要管xdata,不要管R7,這是C語言,不是匯編,都這樣想,不會匯編的人都寫不出C程序來了,至于8051的16位指針,在C中用到的人少到幾乎沒有.
你在數據前面加了xdata,編譯器自然會按照xdata來尋址,
那128個字節做不也什么事的,很多時候是不夠用的,但編譯器會自動處理的typedef struct
{
        unsigned char a;
        char k;
} stru;          
stru disp(unsigned char m)
{
stru p;
p.a=m+1;
p.k=m+10;
return p;
}
void main()
{
    unsigned char a,b;
        stru m;
        m=disp(5);
        a=m.a;
        b=m.k;
    while(1);
}


回復

使用道具 舉報

ID:624769 發表于 2021-11-18 00:19 | 顯示全部樓層
Y_G_G 發表于 2021-11-17 23:49
沙發已經告訴你了,用結構體可以返回多個數據類型,N個!結構體還有一個好處,就是復制,數據A的數據如果要復制 ...

謝謝 答復, 經你上次一說,我打算惡補一下C語言,
這里,我想請教一下:

        m=disp(5);            是不是執行這句的時候, 把p.a  p.k 算出來,然后存在一個地方
        a=m.a;                  這里兩句,就把,上面算出來值,賦給a,b
        b=m.k;

如果,我這里再運行一個
       x=disp(8);
      上面, m.a, m.k 不會受影響。 新的結果在 x.a, x.k?

判答。
回復

使用道具 舉報

ID:401564 發表于 2021-11-18 00:37 | 顯示全部樓層
unsigned char a,b;  
        stru m;//聲明結結構體m,m有兩個成員,就是前面已經標記過的unsigned char a;        char k;        m=disp(5);//參考函數聲明中的執行
        a=m.a;//結構體成員a的值賦值到變量a,兩個a是不一樣的,結構體a跟下面的k同理
        b=m.k;


如果前面有這樣的聲明stru m,x;
那么,這就是有兩個結構體了:m和x,
x=disp(8);//這個只會改變x.a, x.k,m不變
m=disp(1);//這個只會改變m.a, m.k,x不變
x=m;//結構體m賦值到x
等同于:
x.a=m.a;
x.k=m.k;
如果成員很多,或者是在結構體中有數組,x=m;這種操作就相當方便
驗證的最好辦法是仿真或者通過串口在電腦顯示
回復

使用道具 舉報

ID:584195 發表于 2021-11-18 06:53 | 顯示全部樓層
看著有點蒙。
回復

使用道具 舉報

ID:155507 發表于 2021-11-18 08:07 | 顯示全部樓層
188610329 發表于 2021-11-17 22:33
謝謝你的回答, 最近為了提高自己對C的理解,在重溫以及改寫以前的代碼,由于這個傳參問題當初也不知道黑 ...

  1. #include <reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. char data test_A[8];
  5. char xdata test_B[8];
  6. char pdata test_C[8];

  7. void test1(char *p);
  8. void test2(char xdata *p1);
  9. void test3(char pdata *p2);

  10. void test1(char *p)
  11. {
  12.         *p =0x01;
  13. }

  14. void test2(char xdata *p1)
  15. {
  16.                 *p1 =0x02;
  17. }
  18. void test3(char pdata *p2)
  19. {
  20.                 *p2 =0x03;
  21. }

  22. void main()
  23. {
  24.         test1(test_A);
  25.         test2(test_B);
  26.         test3(test_C);
  27.         test2(test_B);
  28.         test2((char xdata *)test_C);
  29.         test2((char xdata *)test_A);
  30. }
復制代碼

  1. C51 COMPILER V9.60.0.0   TEST12                                                            11/18/2021 07:57:43 PAGE 1   


  2. C51 COMPILER V9.60.0.0, COMPILATION OF MODULE TEST12
  3. OBJECT MODULE PLACED IN .\Objects\test12.obj
  4. COMPILER INVOKED BY: C:\Keil_v5\C51\BIN\C51.EXE test12.c OPTIMIZE(8,SPEED) BROWSE DEBUG OBJECTEXTEND CODE SYMBOLS PRINT(
  5.                     -.\Listings\test12.lst) TABS(2) OBJECT(.\Objects\test12.obj)

  6. line level    source

  7.    1          /*
  8.    2          看你指針說了那么多,想來應該指針這塊比較了解,我也正好有指針問題相當疑捊             -ƒ‘,這里想請教一下,希望不吝賜教。
  9.    3          1) 當我聲明一個   數組:  char data test_A[8]; 的時候,
  10.    4          函數, void test1(char *p)    應該是可以傳  &test_A 的。
  11.    5          但是, 當我聲明, 數組  char xdata test_B[8];  的時候,
  12.    6          函數, void  test2(這里怎么寫?)   才能傳 &test_B  ?
  13.    7          然后, 當我聲明, 數組  char pdata test_C[8];  的時候,
  14.    8          函數, void  test3(這里怎么寫?)   才能傳 &test_C  ?
  15.    9         
  16.   10          而,如果要強制用 上面 test2 函數 傳 &test_C  又該在調用的時候怎么寫?
  17.   11         
  18.   12          2)我要聲明一個指針  *p  指向 xdata 的話。
  19.   13          那么, char xdata *p 應該對的吧? 這種情況下 p 應該是雙字節吧?畢竟xdata 地址是
  20.              -雙字節吧? 而*p 應該是單字節的吧? 那么我在使用過程中,如果要讓 *p 變成雙字節, 這不
  21.              -a強制轉換應該怎么寫?
  22.   14         
  23.   15          暫時,想請教這兩個問題,把指針稍微屢出一點頭緒,后續可能還會追問,希望䍊             -¸要嫌棄。
  24.   16          對指針實在是很多不理解,所以很多時候都寧可不用指針,而用數組。
  25.   17         
  26.   18          */
  27.   19          #include <reg52.h>
  28.   20          #define uint unsigned int
  29.   21          #define uchar unsigned char
  30.   22         
  31.   23          char data test_A[8];
  32.   24          char xdata test_B[8];
  33.   25          char pdata test_C[8];
  34.   26         
  35.   27          void test1(char *p);
  36.   28          void test2(char xdata *p1);
  37.   29          void test3(char pdata *p2);
  38.   30         
  39.   31          void test1(char *p)
  40.   32          {
  41.   33   1        *p =0x01;
  42.   34   1      }
  43.   35         
  44.   36          void test2(char xdata *p1)
  45.   37          {
  46.   38   1          *p1 =0x02;
  47.   39   1      }
  48.   40          void test3(char pdata *p2)
  49.   41          {
  50.   42   1          *p2 =0x03;
  51.   43   1      }
  52.   44         
  53.   45          void main()
  54.   46          {
  55.   47   1        test1(test_A);
  56.   48   1        test2(test_B);
  57.   49   1        test3(test_C);
  58.   50   1        test2(test_B);
  59. C51 COMPILER V9.60.0.0   TEST12                                                            11/18/2021 07:57:43 PAGE 2   

  60.   51   1        test2((char xdata *)test_C);
  61.   52   1        test2((char xdata *)test_A);
  62.   53   1      }
  63.   54         
  64.   55         
  65.   56         
  66.   57         
  67.   58         
  68. C51 COMPILER V9.60.0.0   TEST12                                                            11/18/2021 07:57:43 PAGE 3   

  69. ASSEMBLY LISTING OF GENERATED OBJECT CODE


  70.              ; FUNCTION _test1 (BEGIN)
  71.                                            ; SOURCE LINE # 31
  72. ;---- Variable 'p' assigned to Register 'R1/R2/R3' ----
  73.                                            ; SOURCE LINE # 32
  74.                                            ; SOURCE LINE # 33
  75. 0000 7401              MOV     A,#01H
  76. 0002 020000      E     LJMP    ?C?CSTPTR
  77.              ; FUNCTION _test1 (END)

  78.              ; FUNCTION _test2 (BEGIN)
  79.                                            ; SOURCE LINE # 36
  80. ;---- Variable 'p1' assigned to Register 'DPTR' ----
  81. 0000 8F82              MOV     DPL,R7
  82. 0002 8E83              MOV     DPH,R6
  83.                                            ; SOURCE LINE # 37
  84.                                            ; SOURCE LINE # 38
  85. 0004 7402              MOV     A,#02H
  86. 0006 F0                MOVX    @DPTR,A
  87.                                            ; SOURCE LINE # 39
  88. 0007 22                RET     
  89.              ; FUNCTION _test2 (END)

  90.              ; FUNCTION _test3 (BEGIN)
  91.                                            ; SOURCE LINE # 40
  92. ;---- Variable 'p2' assigned to Register 'R0' ----
  93. 0000 A807              MOV     R0,AR7
  94.                                            ; SOURCE LINE # 41
  95.                                            ; SOURCE LINE # 42
  96. 0002 7403              MOV     A,#03H
  97. 0004 F2                MOVX    @R0,A
  98.                                            ; SOURCE LINE # 43
  99. 0005 22                RET     
  100.              ; FUNCTION _test3 (END)

  101.              ; FUNCTION main (BEGIN)
  102.                                            ; SOURCE LINE # 45
  103.                                            ; SOURCE LINE # 46
  104.                                            ; SOURCE LINE # 47
  105. 0000 7B00              MOV     R3,#00H
  106. 0002 7A00        R     MOV     R2,#HIGH test_A
  107. 0004 7900        R     MOV     R1,#LOW test_A
  108. 0006 120000      R     LCALL   _test1
  109.                                            ; SOURCE LINE # 48
  110. 0009 7E00        R     MOV     R6,#HIGH test_B
  111. 000B 7F00        R     MOV     R7,#LOW test_B
  112. 000D 120000      R     LCALL   _test2
  113.                                            ; SOURCE LINE # 49
  114. 0010 7F00        R     MOV     R7,#LOW test_C
  115. 0012 120000      R     LCALL   _test3
  116.                                            ; SOURCE LINE # 50
  117. 0015 7F00        R     MOV     R7,#LOW test_B
  118. 0017 120000      R     LCALL   _test2
  119.                                            ; SOURCE LINE # 51
  120. 001A 7E00        R     MOV     R6,#HIGH test_C  <---應該是雙字節
  121. 001C 7F00        R     MOV     R7,#LOW test_C
  122. 001E 120000      R     LCALL   _test2
  123.                                            ; SOURCE LINE # 52
  124. 0021 7E00        R     MOV     R6,#HIGH test_A  <---應該是雙字節
  125. 0023 7F00        R     MOV     R7,#LOW test_A
  126. C51 COMPILER V9.60.0.0   TEST12                                                            11/18/2021 07:57:43 PAGE 4   

  127. 0025 020000      R     LJMP    _test2
  128.              ; FUNCTION main (END)

  129. C51 COMPILER V9.60.0.0   TEST12                                                            11/18/2021 07:57:43 PAGE 5   

  130. NAME                                    CLASS   MSPACE  TYPE    OFFSET  SIZE
  131. ====                                    =====   ======  ====    ======  ====


  132. P1 . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   0090H  1
  133. P3 . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00B0H  1
  134. IE . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00A8H  1
  135. IP . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00B8H  1
  136. main . . . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  137. SCON . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   0098H  1
  138. TCON . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   0088H  1
  139. test_A . . . . . . . . . . . . . . . .  PUBLIC   DATA   ARRAY    0000H  8
  140. test_B . . . . . . . . . . . . . . . .  PUBLIC   XDATA  ARRAY    0000H  8
  141. test_C . . . . . . . . . . . . . . . .  PUBLIC   PDATA  ARRAY    0000H  8
  142. T2CON. . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00C8H  1
  143. _test1 . . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  144.   p. . . . . . . . . . . . . . . . . .  * REG *  DATA   PTR      0001H  3
  145. _test2 . . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  146.   p1 . . . . . . . . . . . . . . . . .  * REG *  DATA   PTR      0082H  2
  147. _test3 . . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  148.   p2 . . . . . . . . . . . . . . . . .  * REG *  DATA   PTR      0000H  1
  149. PSW. . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00D0H  1


  150. MODULE INFORMATION:   STATIC OVERLAYABLE
  151.    CODE SIZE        =     59    ----
  152.    CONSTANT SIZE    =   ----    ----
  153.    XDATA SIZE       =      8    ----
  154.    PDATA SIZE       =      8    ----
  155.    DATA SIZE        =      8    ----
  156.    IDATA SIZE       =   ----    ----
  157.    BIT SIZE         =   ----    ----
  158. END OF MODULE INFORMATION.


  159. C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)
復制代碼
回復

使用道具 舉報

ID:824490 發表于 2021-11-18 10:59 | 顯示全部樓層
//給你一個簡易代碼:
#include "Reg51.H"

typedef struct {
  unsigned char G;
  unsigned char R;
  unsigned char B;
}ColorVal ;   //聲明一個結構體,包含3個成員;
  

ColorVal changeVal (ColorVal mydata); //結構體成員互換
  
void main()
{

ColorVal temp1;//定義一個結構體

temp1.G=10;temp1.R=20;temp1.B=30; //初始賦值

while(1)

{

   temp1= changeVal(temp1); //互換
         
   P1=temp1.R;  //觀察結果
         P2=temp1.G;
         P3=temp1.B;
         
  }

}


  ColorVal changeVal (ColorVal mydata)
  {
   unsigned char tt;
    tt= mydata.R;
    mydata.R=mydata.B;
    mydata.B=mydata.G;
    mydata.G=tt;
         return mydata; //返回值為結構體:帶3個參數
               
   }
  
  
回復

使用道具 舉報

ID:624769 發表于 2021-11-18 11:29 | 顯示全部樓層

謝謝, 感覺有一些啟發, 但是又抓不住, 我先消化一下, 可能消化完了, 還要再請教一下,  另外, 兩個題外問題。
1)
void main()
{
        test1(test_A);   
        test2(test_B);
        test3(test_C);    < = 這幾個地方,應該是要傳地址,從你翻出來的匯編代碼看,也確實是傳得地址,但是,為什么不需要用 &test_A 是因為數組的關系么?有什么特別的規定么?

2) 你這個翻譯匯編,好像是工具生成的,用什么工具的?

回復

使用道具 舉報

ID:624769 發表于 2021-11-18 11:31 | 顯示全部樓層
Y_G_G 發表于 2021-11-18 00:37
unsigned char a,b;  
        stru m;//聲明結結構體m,m有兩個成員,就是前面已經標記過的unsigned char a ...

謝謝, 科普了一些結構體的知識, 我消化消化,估計,稍后還要麻煩你。
回復

使用道具 舉報

ID:155507 發表于 2021-11-18 16:14 | 顯示全部樓層
188610329 發表于 2021-11-18 11:29
謝謝, 感覺有一些啟發, 但是又抓不住, 我先消化一下, 可能消化完了, 還要再請教一下,  另外, 兩個題外問 ...

1)不需要用 &test_A 是因為數組的關系
http://c.biancheng.net/cpp/html/61.html

2) 就是 Keil
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 男女网站免费观看 | 国产精品久久久久久久模特 | 国产精品久久一区二区三区 | 亚洲aⅴ| 天天干天天操天天射 | 久久久精品一区 | 久久久九九九九 | 黑人精品欧美一区二区蜜桃 | 日韩一级黄色毛片 | 久久伊人在 | 国产精品欧美一区二区 | 日本欧美在线观看视频 | 亚洲在线一区 | 成年视频在线观看 | 中国大陆高清aⅴ毛片 | 久久精彩 | 精品入口麻豆88视频 | 91久色 | 伊人久操 | 日韩在线免费 | 伊人久久国产 | 日韩欧美在线观看 | 高清视频一区二区三区 | 国产亚洲欧美另类一区二区三区 | 亚洲精品一区二区网址 | 一区二区三区欧美 | 青娱乐av | 国产成人精品一区二区三区视频 | 韩日一区二区三区 | 精品国产一区二区三区性色av | 久久国产婷婷国产香蕉 | 久久精品无码一区二区三区 | 亚洲成人福利 | 黄网站涩免费蜜桃网站 | 91亚洲一区 | 美日韩精品 | 巨大黑人极品videos精品 | 精品久久久久国产 | 91人人爽| 欧美日韩视频在线 | 国产成人福利 |