• 締切済み

以下のプログラムで出力が*adrs=9,0となるのはなぜでしょうか?

以下のプログラムで出力が*adrs=9,0となるのはなぜでしょうか? for(adrs=(unsigned long *)0x1100;adrs<(unsigned long *)0x1200;adrs++){   sprintf(log_buff1,"*adrs=%d,%x",*adrs,adrs);   gotoxy(0, 0);   printf(log_buff1);   delay(50); }

みんなの回答

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.4

向こうでも指摘されていますが、 質問する時は環境を詳しく書きましょう。 アドレスの代入とかである程度組み込みという事は 察しはつきますが、組み込みならばそれこそ、 環境が特定できないのですから。。。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

int と long の大きさが違う可能性があります. %d は int, %x は unsigned int に対する変換指定です. 一方, 実際に渡している *adrs は unsigned long です. ということで, long と int の大きさが違うと「%d で *adrs の前半だか後半だかを, %x で残りを変換する」ということがありえます. ちなみに 0x00001100 にする必要性は全くないと思うのだが>#2.

全文を見る
すると、全ての回答が全文表示されます。
  • crew21
  • ベストアンサー率26% (58/222)
回答No.2

このプログラムは全体の中からの抜粋なのかもしれんけど、それはわからないからこのプログラムだけから言うと、 いきなり即値(0x1100)でポインタを初期化するもんじゃないよ。(何かよほど根拠があれば別だけどね) その場所(0x1100が指す場所)に何があるかわからないんだよ。 adrsの指す場所に 9,0 という文字列があったからそうなったんだよ。 もっと言うと、たまたまそこに 9,0 という文字列があって、その直後に運の良いことにNULLがあったからだと思うよ。 普通はそういうことはないから、訳の分からない命令を実行されて即死。 良くてもメモリ保護が働いて、プログラム実行中断だよ。 しかしコレ実行してよくプログラムがハングしなかっったね。 普通なら sprintf() の *adrs を評価した時点で即死だよ。(上に書いた理由により) それに unsigned long は4バイトなんだから、表現するなら 0x00001100 だよ。

全文を見る
すると、全ての回答が全文表示されます。
  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

ポインタの変換指定子は%xではなく%pのほうがいいです

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 文字列変換プログラムのポインタについて

    いかの関数は、文字列を16進文字列に変換する関数です。過去の質問を参考に自分で作りました。 動作することはするんですが、よく見るとpoとpiは領域確保していません。これってプログラム上まずいでしょうか。 char *conv( char *buff, char *str ) {   char *po;   char *pi;   for(po=buff, pi=str; *pi; pi++)   {     if(0 <= *pi && *pi <= 15)     {       sprintf(po, "%x", 0);       po++;       sprintf(po, "%x", *pi);       po++;     }else {       sprintf(po, "%x", (0x0f & (*pi >> 4)));       po++;       sprintf(po, "%x", (0x0f & (*pi % 16)));       po++;     }   }   *po='\0';   return(buff); }

  • 計算が終わらないはずなのになぜか終わる?

    以下のプログラムをVisual stadio 6.0でコンパイルし プロジェクトの構成をWin32 releaseを選択し実行したら一瞬で計算が終わりました。約2^64の計算量であるので明らかに終わらないはずなのですがどうしてなんでしょうか? #include <stdlib.h> #include <stdio.h> void main() { unsigned int y; unsigned int x3; unsigned int out[16]={0}; for(y=0x1;y<=0xfffffffe;y=y+0x1){ for(x3=0x1;x3<=0xfffffffe;x3=x3+0x1){ x3 = x3 +1; y = y + 1; out[15] = y; } } //printf("%0x\n",out[15]); }

  • PICのプログラムについて質問です

    使用するPICは16F84Aで、MPLAB IDEv8.88を使ってこのようなプログラムを作りました。 #include"pic.h" static void pic_init(); static void Delay_ms(unsigned char ms); static void Delay_1ms(); void main(){ pic_init(); while(1) { RB0 = 1 ; Delay_ms(250); Delay_ms(250); Delay_ms(250); RB0 = 0 ; Delay_ms(250); Delay_ms(250); Delay_ms(250); } static void pic_init() { // GPIO = 0b00000000; TRISA = 0xFF ; TRISB = 0x00 } static void Delay_ms(unsigned char ms) { unsigned char c; for (c=ms ; c>0 ; c--) { Delay_1ms(); } } static void Delay_1ms() { unsigned int cnt; unsigned int i; cnt = 76; for (i=0 ; i<cnt ; i++) { NOP(); } } ポートB0の出力を0から1にするプログラムなのですが、実行すると Error [314] C:\Users\moriwaki\Desktop\PIC program\step_test2.c; 52.24 ";" expected Error [254] C:\Users\moriwaki\Desktop\PIC program\step_test2.c; 77.0 undefined variable: "pic_init" ********** Build failed! ********** というエラーが出ます。このようなエラーが出る原因を教えて頂けないでしょうか。お願いします。

  • C言語プログラムについての質問です。下のプログラムがなぜ降順で出力され

    C言語プログラムについての質問です。下のプログラムがなぜ降順で出力されるのか分かりません。何回も確認したのですが、不等号の向きが昇順になっているのに、どうして降順になるのかが理解できません。 ご教授お願いします。   #include <stdio.h>   #define MAX 10000   int main (int argc, const char * argv[]) { int N,data[MAX],d[MAX],j,k,w,x,a; x=0; a=1; do{printf("学生番号を入力してください\n");    scanf("%d",&N);   if(N!=0){printf("得点を入力してください\n"); scanf("%d",&data[N]);}x++;} while(N!=0);   for(j=0; j<x;j++){ d[j]=data[j];} for(j=0; j<x;j++)      {for(k=0;k<x-j-1;k++){   if(d[k]>d[k+1]){ w=d[k]; d[k]=d[k+1]; d[k+1]=w;}}} printf("昇順での整列結果\n"); for(j=x-1;j>0;j--){ printf("%d位 %d点\n",a,d[j]);a++;} return 0; }

  • とあるプログラムを教えてほしいのですが

    はじめましてこんばんは hommado と申します。 じつは先週の授業でこんな問題を出されたんですがもしできたらとあるプログラムを教えてほしいのです。 問題は 「キーボードから何階調にするのかを読み込むことで、入力画像LAX.bmpを任意の階調数に変換する」という プログラムです。 一応下に素体のプログラムをおいたんで、其のプログラムに何か付け足す感じでお願いします。「/*******↓基本的には、この範囲に画像処理プログラムを書く****/」から 「 /********↑**************************************************/」の中にプログラムを書くかんじなのでもし分かったら教えてください。お願いします。 あと何か他の所に付け足すようなところがあったら教えてください ここから元のプログラム // Bitmapファイルを読み込んで, // 別のファイルに出力するだけのプログラムです #include<stdio.h> #define XSIZE 256 /* 画像の横サイズ*/ #define YSIZE 256 /* 画像の縦サイズ*/ void main(void) { int x,y; char fni[40],fno[40]; /* 入力ファイルと出力ファイルの名前を格納するための配列*/ unsigned char head[1078],buf[YSIZE][XSIZE]; /* 入力ファイル(ビットマップファイル)のヘッダ情報と輝度値情報を格納するための配列*/ unsigned char in_image[YSIZE][XSIZE]; /* 入力画像の画素の輝度値を格納するための配列*/ unsigned char out_image[YSIZE][XSIZE]; /* 出力画像の画素の輝度値を格納するための配列*/ FILE *fp,*fp2; /* ファイルポインタ*/ printf("ファイル名を入れてください:"); scanf("%s",fni); fp=fopen(fni,"rb"); /* 読み込み& バイナリモードでオープンする*/ /* 配列head にビットマップファイルのヘッダ情報が格納されます*/ fread(head,sizeof(unsigned char),1078,fp); /* unsigned char 型のデータ×個を配列head に読み込む*/ /* 配列buf にビットマップファイルの輝度値情報が格納されます*/ fread(buf,sizeof(unsigned char),XSIZE*YSIZE,fp); for(y=0;y<YSIZE;y++){ for(x=0;x<XSIZE;x++){ in_image[y][x]=buf[y][x]; /* 画像の左下の画素が座標buf[0][0] です*/ } } printf("読み込み終了しました!\n"); printf("出力ファイル名を入れてください:"); scanf("%s",fno); /*******↓基本的には、この範囲に画像処理プログラムを書く****/       ここにプログラムを書いてください!      (もしここ以外で、他の所で付け足すプログラムがあったら何行目に       何を書くのかも教えてください) /********↑**************************************************/ fp2=fopen(fno,"wb"); /* 書き込み& バイナリモードでオープンする*/ /* 配列head の内容を出力ファイルに書き込む*/ fwrite(head,sizeof(unsigned char),1078,fp2); /* 配列out_image の内容を出力ファイルに書き込む*/ fwrite(out_image,sizeof(unsigned char),XSIZE*YSIZE,fp2); fclose(fp); /* ファイルをクローズする*/ fclose(fp2); /* ファイルをクローズする*/ printf("作業完了!\n"); }

  • for文を使ったプログラムで困っています

    for文を使って、10000からある数xを何回引けるか?またその残りを求めるプログラム(例:10000から3000は3回引くことができ、残りは1000である。)を作りたいのですが、引く回数が1多くなってしまいます。どこがいけないかわからないので困っています。よろしくおねがいします。 #include<stdio.h> void main() { int x; int Sa = 10000; int y; printf("10000以下の数を入力してください:"); scanf("%d",&x); for(y = 1; y*x <= 10000 ; y++) { Sa = Sa - x; } printf("10000から%d回引くことができます。\n",y); printf("残りは%dです。",Sa); }

  • 因数分解のプログラム

    皆さんごきげんよう。  3次式の因数分解をするプログラムを作っているのですが、3重解のときの求め方で困っています。 具体的には、 for(x=-100; x<101; x++){ if(a*x*x*x+b*x*x+c*x+d == 0){ printf("%d",x); } } このようにして、与式が0になるときにその値を出力しようと思うのですが、このやり方では、例えば(x-1)^3で、答えが"1"一つだけになってしまいます。この答えを、"1","1","1"としたいのです。  よろしくお願いします。

  • cygwinを使ってcsvファイルを読み込み、出力させようとしています

    cygwinを使ってcsvファイルを読み込み、出力させようとしています。 とりあえず、読み込みのみのプログラムを作成し、 実行させてみたのですが(run ファイル名.csv と入力) 「Error: could not start C:\cygwin\home\ユーザー名ファイル名.csv」 と出力され、読み込みができず、困っています。 プログラム初心者です。 恐縮ですがご回答よろしくお願いします。 以下に、読み込みプログラムとcsvファイルを記載します。 (プログラムは拾い物です。) <プログラム> #include <stdio.h> #define MAX_ITEM_SIZE 100 #define MAX_LINE_SIZE 1024 char *GetCSVItem(char *wp, char *buff, int size); void main(int argc, char *argv[]) { FILE *fp; char buff[MAX_LINE_SIZE], *wp, item[3][MAX_ITEM_SIZE]; int i1, len; if(argc != 2){ printf("comand error nyuuryoku keishiki\n"); return; } fp = fopen(argv[1], "r"); if(fp == NULL){ printf("can not open file[%s].\n", argv[1]); return; } for(;;){ if(fgets(buff, MAX_LINE_SIZE, fp) == NULL) break; len = strlen(buff); if(len == 0 || buff[len-1] != '\n'){ if(feof(fp) == 0){ printf("data error[%s].\n", buff); return; } } buff[len-1] = '\0'; wp = buff; if((wp = GetCSVItem(wp, item[0], MAX_ITEM_SIZE)) == NULL){ printf("error(1)\n"); break; } if((wp = GetCSVItem(wp, item[1], MAX_ITEM_SIZE)) == NULL){ printf("error(2)\n"); break; } if((wp = GetCSVItem(wp, item[2], MAX_ITEM_SIZE)) == NULL){ printf("error(3)\n"); break; } if(*wp != '\0'){ printf("error(4)\n"); break; } for(i1 = 0; i1 < 3; i1++){ printf("%d:%s\n", i1+1, item[i1]); } } fclose(fp); } char *GetCSVItem(char *wp, char *buff, int size) { int i1; buff[0] = '\0'; while(*wp == ' ' || *wp == '\t') wp++; if(*wp == '\0'){ return(NULL); } for(i1 = 0; i1 < MAX_ITEM_SIZE; i1++, wp++){ if(i1 >= size) return(NULL); buff[i1] = *wp; if(*wp == '\0'){ buff[i1] = '\0'; return(wp); } if(*wp == ','){ wp++; buff[i1] = '\0'; break; } } return(wp); } <csvファイル> 1,2,3 11,12,13 21,22,23

  • 素数を求めるプログラム

    1000以下の素数を求めるプログラムについての問題について考えているのですが、何故2の数のとき、乗除を行う回数が加算されないのかが分かりません。また、3のとき乗除を1回しか行わないのか分かりません。理論的に2が素数となるのは定義付けられているから必要ないのか、とも思ったのですがそれならcounter++で2が範囲にあるのに加算されないという理由がよくわかりません。 初歩的な問題ですみませんが回答頂けると有難いです。 プログラムは下記の通りです。 #include <stdio.h> int main(void) { int i,no; unsigned long counter = 0; for (no = 2; no <= 1000; no++) { for (i = 2; i < no; i++) { counter++; if (no % i == 0) break; } if (no == i) printf("%d\n" , no); } printf("乗除を行った回数:%lu\n" , counter); return (0); }

  • C90とC99の計算結果の違い?

    C言語の質問です。 gcc version 4.3.2 (Ubuntu 4.3.2-1ubuntu12) 以下のプログラムをgccでコンパイル・実行すると(1)に入り,"a"が出力されます。unsigned intの計算なのでラップアラウンドが生じtest=4294716272となるのは私の期待どおりです。 ただ、gcc -std=c99でコンパイル・実行すると(2)に入り,"b"が出力されました。c99でコンパイル・実行すると計算結果がなぜ異なっているのかが分かりません。 long test = 0; unsigned int x = 184; unsigned int y = 251208; test = (x-y); if(test == 4294716272){ printf("a");// (1) }else if(test == -251024){ printf("b"); // (2) }