Stringメソッドへの整数[重複] -- c フィールド と mplab フィールド 関連 問題

integer to string method [duplicate]












0
vote

問題

日本語

整数を作成しようとしています(最大4桁の文字列)。 これが私の方法です:

<事前> <コード> char *ToInt( int Value) { char buffer[4]; sprintf(buffer, "%04d", Value); return buffer; }

その後文字列は各バイトに分離され、それを7セグメントLCDに送ります。 問題は私が警告を受けることです

<事前> <コード> warning: (365) pointer to non-static object returned

そしてこのすべてのエラー

のすべて <事前> <コード> C:Program Files (x86)Microchipxc8v1.45sourcescommondoprnt.c:538: warning: (373) implicit signed to unsigned conversion C:Program Files (x86)Microchipxc8v1.45sourcescommondoprnt.c:541: warning: (373) implicit signed to unsigned conversion C:Program Files (x86)Microchipxc8v1.45sourcescommondoprnt.c:1259: warning: (373) implicit signed to unsigned conversion C:Program Files (x86)Microchipxc8v1.45sourcescommondoprnt.c:1305: warning: (373) implicit signed to unsigned conversion C:Program Files (x86)Microchipxc8v1.45sourcescommondoprnt.c:1306: warning: (373) implicit signed to unsigned conversion C:Program Files (x86)Microchipxc8v1.45sourcescommondoprnt.c:1489: warning: (373) implicit signed to unsigned conversion C:Program Files (x86)Microchipxc8v1.45sourcescommondoprnt.c:1524: warning: (373) implicit signed to unsigned conversion
英語

I'm trying to create an integer (maximum four digits to string). Here is my method:

char  *ToInt( int Value) {     char buffer[4];     sprintf(buffer, "%04d", Value);     return buffer; } 

After that the string is separeted to each byte and send it into a 7 segment LCD. The problem is that i'm taking a warning

 warning: (365) pointer to non-static object returned 

and also all of this errors

 C:Program Files (x86)Microchipxc8v1.45sourcescommondoprnt.c:538: warning: (373) implicit signed to unsigned conversion C:Program Files (x86)Microchipxc8v1.45sourcescommondoprnt.c:541: warning: (373) implicit signed to unsigned conversion C:Program Files (x86)Microchipxc8v1.45sourcescommondoprnt.c:1259: warning: (373) implicit signed to unsigned conversion C:Program Files (x86)Microchipxc8v1.45sourcescommondoprnt.c:1305: warning: (373) implicit signed to unsigned conversion C:Program Files (x86)Microchipxc8v1.45sourcescommondoprnt.c:1306: warning: (373) implicit signed to unsigned conversion  C:Program Files (x86)Microchipxc8v1.45sourcescommondoprnt.c:1489: warning: (373) implicit signed to unsigned conversion C:Program Files (x86)Microchipxc8v1.45sourcescommondoprnt.c:1524: warning: (373) implicit signed to unsigned conversion 
</div
     
         
         

回答リスト

1
 
vote
vote
ベストアンサー
 

コメントやその他の回答で既に言及されているため、ローカル変数を返す(AKA <コード> buffer )は、関数が戻ってくるとローカル変数が破壊されるとは限らないものです。さらにバッファが小さすぎて4文字を文字列として保持するには、文字列をゼロに終端するために追加の文字が必要です。 4 文字を(少なくとも) buffer[5] を保持するために。ただし、 %04d に正確に4文字が印刷されることを確認しないことに注意してください。高いINT値は、より多くの文字を生成し、(もっと)バッファオーバーフローを実行します。そのため、最大(おそらく負)の整数の印刷を保持できるバッファが必要です。

それでは代わりに何をできるか?

2つのオプションがあります。 1)関数内で動的メモリ割り当てを使用するか2)発信者に関数のバッファを供給させる

それは何かを見るかもしれません:

<事前> <コード> #include <stdio.h> #include <stdlib.h> // The maximum number of chars required depends on your system - see limits.h // Here we just use 64 which should be sufficient on all systems #define MAX_CHARS_IN_INT 64 char* intToMallocedString(int Value) { char* buffer = malloc(MAX_CHARS_IN_INT); // dynamic memory allocation sprintf(buffer, "%04d", Value); return buffer; } // This could also be a void function but returning the buffer // is often nice so it can be used directly in e.g. printf char* intToProvidedString(char* buffer, int Value) { sprintf(buffer, "%04d", Value); return buffer; } int main(void) { int x = 12345678; char str[MAX_CHARS_IN_INT]; // memory for caller provided buffer char* pStr = intToMallocedString(x); intToProvidedString(str, x); printf("%s - %s ", str, pStr); free(pStr); // dynamic memory must be free'd when done return 0; }

出力:

<事前> <コード> 12345678 - 12345678
 

As it has already been mentioned in comments and other answers, returning a local variable (aka buffer) is something that you shall never do as local variables are destroyed once the function return.

Further you buffer is too small to hold the 4 characters as a string in C requires an extra character to zero terminate the string. So to hold 4 character you'll (at least) need buffer[5]. However, notice that %04d does not ensure that there will be printed exactly 4 characters. A high int value will produce more characters and result in (more) buffer overflow. So you'll need a buffer that can hold a print of the largest (perhaps negative) integer.

So what can you do instead?

You have two options. 1) Use dynamic memory allocation inside the function or 2) let the caller supply the destination buffer to the function.

It may look something like:

#include <stdio.h> #include <stdlib.h>  // The maximum number of chars required depends on your system - see limits.h // Here we just use 64 which should be sufficient on all systems #define MAX_CHARS_IN_INT 64  char* intToMallocedString(int Value) {     char* buffer = malloc(MAX_CHARS_IN_INT);  // dynamic memory allocation     sprintf(buffer, "%04d", Value);     return buffer; }  // This could also be a void function but returning the buffer // is often nice so it can be used directly in e.g. printf     char* intToProvidedString(char* buffer, int Value) {     sprintf(buffer, "%04d", Value);     return buffer; }  int main(void) {     int x = 12345678;     char str[MAX_CHARS_IN_INT];  // memory for caller provided buffer      char* pStr = intToMallocedString(x);     intToProvidedString(str, x);     printf("%s - %s ", str, pStr);      free(pStr);    // dynamic memory must be free'd when done     return 0; } 

Output:

12345678 - 12345678 
</div
 
 
   
   
0
 
vote

スタックに割り当てられているスペースを割り当てられている buffer を返しようとしています。

関数が戻るとすぐにスタックが破棄されます。そのため、戻り値は現在ダングリングポインタです。

また、NULLのターミネータがありません。

 

You are trying to return buffer which has been allocated space on the stack.

Stack gets destroyed as soon as the function returns. So the returned value is now just a dangling pointer.

Also, the null terminator is missing.

</div
 
 

関連する質問

0  XC8ライブラリー構成と複数のソースファイル間の#defines  ( Xc8 library organization and defines across multiple source files ) 
これは複雑な投稿ですので、辛抱してください。私はそれを可能な限り集めようとしました... PICマイクロコントローラのための別のツールチェーンを使用してXC8にやってくる。以前のコンパイラで、自分のライブラリを設定して使用し、それらのライブラリーで定義を使...

2  extern structを使用するときのXC8で競合する宣言  ( Conflicting declarations in xc8 when using extern struct ) 
私は、.cファイルに定義されている構造体である変数を持っています: <事前> <コード> struct { int write_cursor; int read_cursor; message messages[10]; } out_m...

6  mplab xでアセンブリを閲覧する方法  ( How do i view assembly my c code in mplab x ) 
私はCでコードを書いていますが、私はコードを最適化し、いくつかの機能がどのくらい時間かかるかを把握することができるようにアセンブリファイルを見る必要があります。誰かがアセンブリコードをプルアップするための簡単な方法を知っていますか? ...

1  mplabの点滅LEDが機能していませんか?  ( Blinking led on mplab not working ) 
MPLABを使用して新しいマイクロチップボードをプログラムし、Pickit3 を使用してプログラミングするプログラミング コード: <事前> <コード> $chatDATA=$_POST['chatDATA']; $sendDATA=$_POST['send...

2  アレイを更新するためのUARTからのデータ  ( Data from uart to update an array ) 
誰かがここで私を助けることができることを願っています。 C(PHPの背景から来て)C(PHPの背景から来る)にかなり新しいことがあり、この問題について始めました。まだ頭の丸いポインターなどを手に入れようとしている、喜びPHPは持っていません。 SO BASI...

0  それがそうでない間の変数の複数の定義  ( Multiple definition of variable while it is not ) 
MPLAB X IDEを使用して空のプロジェクトをコンパイルしようとしています。クロックの最初の設定を最初に設定するためにMCC(Microchip Code Configurator)を使用しました。 MCCは、「traps.c、traps.h、syste...

1  Mplab X IDEのCのIOピンからの読み書き  ( Reading and writing from io pins in c on mplab x ide ) 
最近PIC32MX764F128Hマイクロコントローラを使用して作業を開始しました。私はPIC18とPIC24で物事をやっていました..。 AKA CCS Cコンパイラを使用しているので、MPLAB Xの32ビットチップのためのいくつかの本当に基本的なCコード...

1  アドレスエラーISR  ( Address error isr ) 
DSPIC30F3011マイクロコントローラでCプログラムを実行してデバッグしようとしています。 MPLABでコードを実行すると、このコードは常にこのISRで停止する傾向があり、私のコードは実行されていません。私が簡単な間違いをキャッチするためのものです(す...

0  2バイト配列をunsigned long変数に変換する方法  ( How to convert two bytes array into unsigned long variable ) 
2バイトを1つの符号なしの長い変数に組み合わせることで、現在のコードは機能しません。 MPLAB C18コンパイラを使用していますが、これは私のコードです。 <事前> <コード> unsigned long red = 0; BYTE t[2...

0  PIC16F84 - EEPROM読み書き  ( Pic16f84 eeprom read and write ) 
PIC16F84マイクロコントローラのEEPROM読み書きサブルーチンを書き込むタスクを持っています。私はそのようなコードを書いた: <事前> <コード> EEPROM_Read clrw bsf STATUS...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有