aris-wiz の回答履歴
- 文字列の宣言(ポインタと配列)
Cでソケット通信などはできるくらい(もちろんできると言っても私のレベルで) になりましたが、文字列を宣言する際に char *str = "ahaha'; char str[] = "ahaha"; の2種類の違いが今イチしっくりきません。 いろんな参考書でこれの説明はありましたが、でも結局なんなんだ、という感じです。 ポインタで宣言するべき時、配列で宣言するべきときが判断できません。 またポインタで宣言するとエラーが出るけど試し配列で宣言してみたら なんか知らんが動いた、ということも多々ありましたが理由がよくわからなかったです。 よろしくお願いいたします。
- 配列について(C言語)
配列の要素において一番目の要素以外を0にするプログラムを以下のように作成したのですが(while文を*b != 0という条件で作りたい)、while文内のところが間違っているためだと思われるのですが、うまく実行されません(実行しても何も表示されない)。どのようにしたらいいのでしょうか。または、何かが抜けている、ほかの部分が間違っている等もあるためにうまく実行されないということなのでしょうか。 #include <stdio.h> int main(void) { int a[5] = {5, 78, 2, 9, 0}; int i, *b; b = &a[0]; while (*b != 0){ if(*!=a[0]) *ptr=0; else *ptr=a[0]; } for (i = 0; i < 5; i++){ printf("ptr値 =%d ptrアドレス =%p \n", *ptr, ptr); } printf("\n"); return (0); }
- 正しくないのに実行できてしまう理由
配列の動的確保でこのような配列の確保はよくないと聞いたんですが 警告1つなしにコンパイルが通って実行できてしまいます。 このようなソースは本当によくないのでしょうか? また引き起こすような問題等はあるのでしょうか? int main(void) { int x, i , j; scanf("%d",&x); //xの大きさを入力 int cell[x][x]; for(i=0;i<x;i++) { for(j=0;j<x;j++) { printf("cell[%d][%d]入力>\n",i,j); scanf("%d",&cell[i][j]); } } for(i=0;i<x;i++) { for(j=0;j<x;j++) { printf("cell[%d][%d]=%d\n",i,j,cell[i][j]); } } return 0; }
- 文字列の照合についての質問(C言語)
こんにちは<_ _> 文字列の照合に関する質問です。 データを探索するプログラムを作っていましたが 既存データと入力データの照合ができません。 #include<stdio.h> #include<string.h> #define N 10 int main(void) { static struct girl{ char *name; int age; }a[]={"Ann",18,"Rolla",19,"Nancy",16,"Eruza",17,"Juliet",18, "Machilda",20,"Emy",15,"Candy",16,"Ema",17,"Mari",18}; char key[20]; int i; printf("検索するdata ? : "); scanf("%s",key); for(i=0;i<N;i++){ ここの部分です if(a[i]==key){ break; } } printf("%s %d",a[i],a[i]); return 0; } 照合するにはどうしたらいいのでしょうか? (#include<stdio.h> から int i;までは変えてはいけないと問題にあります。)
- ベストアンサー
- C・C++・C#
- hisetu_001
- 回答数6
- VisualStudio2005でのビルドについて
VisualStudio2005でのビルドについての質問です。 作成したプログラムを他のPCで起動できるようにビルドする方法で 1:プロジェクト(P)→○○ のプロパティ→構成プロパティ→C/C++ 2:ランタイムライブラリをMT(マルチスレッド)に変更 3:ビルド(B)→構成マネージャー 4:構成をDebug→Releaseに 5:ビルド(B)→○○ のビルド(U) で他のPCでも起動出来ることを確認したんですけど 2:のランタイムライブラリをMD(マルチスレッドDLL)に 変更した場合の他PCで起動できるようにするための方法が 全くわかりません。分かる方いましたらよろしくお願いします。
- charと%c , %s の関係について
char型の変数の扱いで悩んでいます。 具体的には以下の二つのプログラムの差異についてです。 ---------------------- char c; scanf("%c", &c); printf("%c\n", c); ----------------------- char c; scanf("%s", &c); printf("%s\n", &c); ----------------------- 上のプログラムは正しいと思うのですが、下のプログラムが正しいのかどうか、わかる方に教えていただきたいと思い質問させていただきました。 どちらのプログラムも問題なく動作します。 僕自身は 下のプログラムの printf 関数については間違った使い方なのではないかと思っています。 scanf("%s", &c) は入力された文字のうち、終端文字の手前までの文字を引数のポインタが示すオブジェクトへ順に格納していく関数だと理解しているので、入力された文字が一文字だった場合、&cの示すオブジェクトに文字が代入されると考えたからです。 逆に printf("%s", &c) は、&cの示すオブジェクトから”ヌル文字”の手前までの文字列を順に表示する関数だと理解しているので、問題なく動作しているのは&cで示されるオブジェクトの後ろの領域が偶然'\0'だったからではないかと考えたからです。 何かの本で、未使用の領域は0である確率が高いという記述をみたことがあり、'\0'は0と同じだということなので問題なく動作する率が高いのではないかと思っています。 僕の考え方がどの程度正しくて、正確にはどうなのかを教えて欲しいです。 ちなみに、 ----------------------- char c; char str[100]; scanf("%s", str); scanf("%c", &c); ------------------------ と書くと c には改行文字が代入されてしまいます。 scanf("%s", str); において"aasssdd "と最後に空白を入れると c には空白文字が代入されます。 しかし、 -------------------------- char str1[100]; char str2[100]; scanf("%s", str1); scanf("%s", str2); -------------------------- においては、 scanf("%s", str1); で "asdfg "と最後に空白を入れても次のstr2が空白で始まることはありません。 この辺りの処理がどのような法則で実行されているのかが分かりづらくて悩んでいます。 おそらく、 scanf("%s", str); の場合には最初の文字が空白や改行文字でも、その次に有効な文字があればそれらの改行や空白を無視するのではないかと思っています。 分かる方がいましたら回答をよろしくお願いします。
- VC++にてメンバ変数名を作成し使用する場合
VC++6.0を使用しています。 ダイアログにラジオボタンが40個存在し それぞれのメンバ変数名はm_day1~40です。 特定のラジオボタンを指定し、”1”と表示したいのですが、 下記のようにコーディングを行うと 「'SetWindowTextA' : 'CString' のメンバではありません。」 とコンパイルエラーが出ます。 何か良い改善策はありますでしょうか? 宜しくお願い致します。 char strResult[33]; CString strMakeDay; strMakeDay = "m_day"; strMakeDay = strMakeDay + itoa(intFirstWeek + 1, strResult, 10); strMakeDay.SetWindowText("1"); //intFirstWeek:int型の引数です
- コンパイルエラーの原因が解らず困っています。
構造体に自作関数から値を入力したいのですが、エラーがでて詰まっています。コンパイルエラーの原因は●の行で signed char * 型として定義されているので int は渡せない と表示されました。 何故このエラーが表示されるのか、また対処法を教えて下さると幸いです。。 #include<stdio.h> #include<string.h> typedef struct { char l_name[256]; int l_age; int l_height; }HUMAN; Input (HUMAN*); main() { HUMAN *l_phuman; Input(l_phuman); } Input(HUMAN* l_phuman) { char names[20]; int ages; int heights; printf("名前を入力してください\n"); scanf("%s" , names); printf("歳を入力してください\n"); scanf("%d" , &ages); printf("歳を入力してください\n"); scanf("%d" , &heights); ●strcpy(*l_phuman->l_name,names); l_phuman->l_age=ages; l_phuman->l_height=heights; printf("%s" , l_phuman->l_name); printf("%d" , l_phuman->l_age); printf("%d" , l_phuman->l_height); } 尚指示としてHUMAN *l_phumanを使って構造体に入れなければなりません。。
- 構造体の自作関数内で入力した値の返し方
こんばんはm(_ _)m C言語の構造体に関する質問です。 (当方初心者なので用語等見苦しい点があると思いますがご了承&指摘をお願いします。) 日付を元号に直したりする構造体のプログラムでmain関数ではなく自作関数内で値を入力する問題を解いていまして… #include<stdio.h> typedef struct{ int year; int month; int day; }date; date put_date(date x) /*ここで日付を入力*/ { date x; printf("年:"); scanf("%d",x.year); printf("月:″); scanf("%d",x.month); printf("日:"); scanf("%d",x.day); return x; } int main(void) { date x; x.year=0; /*問題では関数外で宣言した変数では足りないため に他の自作関数で変数を使いまわすために必要な処 理で初期化しました。*/ put_date(x); gen(x); /*西暦の日付を元号で表す自作関数でここへput_date で取得したx,y,zを送りたいのですがmainに来た時点 でput_dataで入力した値が出ませんでした。(元号に 直す関数は省略いたしました)*/ } put_date内でprintfしましたところx,y,zの値が入力した通りに出ましたが、main内ではx.year=0,x.month=12,x.day=0という値になってしまいます。 put_dateで入力した値をmain関数内だけでなく他の自作関数内でも使用したいのですがどうすればよろしいでしょうか?
- ベストアンサー
- C・C++・C#
- hisetu_001
- 回答数5
- (マルチスレッド)_beginthreadexに複数の引数を渡す
現在プログラムでマルチスレッドをやろうとしているのですが、 マルチスレッドの関数に数値や配列などの引数を渡すことは可能でしょうか? MSDNで調べてみると、_beginthreadex関数の4番目のNULLのところに引数リストを 指定できるとあったのですが、その意味が良くわかりませんでした。 以下のプログラムの場合にマルチスレッドに変数a, b, cを引数として渡したい場合は どのように書けばいいのでしょうか? #include <stdio.h> #include <windows.h> #include <process.h> unsigned WINAPI MyThread( void *lpx ){ while (1) { printf("スレッド実行中\n"); Sleep(1000); } return 0; } void main(){ // スレッドに渡したい変数の宣言 int a = 128; int b = 256; int c = 512; // スレッドIDの宣言 DWORD thID; // マルチスレッドの開始 (HANDLE)_beginthreadex( NULL, 0, &MyThread, NULL, 0, (unsigned int*)&thID ); // ループ while (1) { printf("メイン関数実行中\n"); Sleep(2000); } }
- ベストアンサー
- C・C++・C#
- amazontester
- 回答数4
- DirectXのパス設定
VisualStudio2005を使っています。 DirectX9.0cをインストールした後に、ライブラリファイルとインクルードファイルにパスを指定しようとしているのですが、 なぜかMicrosoft\DirectXのフォルダが存在しないんです。 インストールできなかったのかと思い、DirectXのダウンロードページからいろんなファイルをインストールしたりしてみたのですが そのせいでいろんなファイルがごちゃごちゃ発生して、どうしたらいいかわからなくなりました; コントロールパネルを見てもアンインストールできる項目にDirectXが入ってなくて、大量発生したファイルもどうしてよいのやら;; なんかパニクってごちゃごちゃですが、まとめると ・VisualStudio2005でDirectXのLibファイルとIncludeファイルを使うにはどのDirectXをインストールしたらいいのか ・間違ってインストールしたファイルは同処分したらいいのか です、よろしくお願いしますorz
- テーブル(配列)の初期化を外部ファイルに指定
お世話になっております。 以下は列車の時刻表を検索するCのソースです // ヘッダー省略 #define PRN_PORTD 0x0378 #define PRN_PORTC 0x037a void lightLED( int num, int loc ) { static int table[] = { 0x3F, // 0 0x06, // 1 0x5B, // 2 0x4F, // 3 0x66, // 4 0x6D, // 5 0x7D, // 6 0x27, // 7 0x7F, // 8 0x6F, // 9 }; // table[ num ] で数値から変換 printf("num[%x] port[%x]\n loc[%d]", able[ num ], PRN_PORTD, loc ); // デバックの為 outb( table[ num ], PRN_PORTD ); outb( loc, PRN_PORTC ); outb( loc | 0x04, PRN_PORTC ); outb( loc, PRN_PORTC ); } // 時刻表の時:分を表示する関数 void digitalLED( int time ) { int ret, four, three, two, one; four = ((time / 1000) % 10); // 4桁目を取り出す three = ((time / 100) % 10); // 3桁目を取り出す two = ((time / 10) % 10); // 2桁目を取り出す one = ((time / 1) % 10); // 1桁目を取り出す ret = ioperm( PRN_PORTD, 4, 1 ); lightLED( four, 0x03 ); // 時の10桁を表示 lightLED( three, 0x02 ); // 時の 1桁を表示 lightLED( two, 0x01 ); // 分の10桁を表示 lightLED( one, 0x00 ); // 分の 1桁を表示 ret = ioperm( PRN_PORTD, 4, 0 ); exit(0); } // ここまでのソースはLEDに表示させる関数です int main(void) { char type; int ret; do { // ↓テーブル初期化。本来はこれを使用したいのですが。 // static int table[] = { ここで外部ファイル指定 }; / int findtime; // 0000形式に変換後の現在時間 int *search; // テーブル内の検索時間 int h; // 時 int m; // 分 FILE *file; time_t timer; // 現在時刻を取得し地方形式に struct tm *local; time(&timer); // 現在時刻の取得 local = localtime(&timer); // 現在時刻を構造体に変換 h = local->tm_hour; // 時 m = local->tm_min; // 分 findtime = h * 100 + m ; // 現在時間を0000形式へ変換 file = fopen( "jikoku.txt", "r" ); if( file == NULL ) { puts( "jikoku.txtが開けません" ); return 1; } while ( !feof(file)) { fscanf(file, "%d", &*search); printf("%d\n", *search); // 該当時間検索 // for ( search = table ; *search != -1 ; search++ ) { // ↑時刻表を外部ファイルにしたことによって使わなく // なったのですが。。。 if ( *search > findtime ){ break; } } // 結果表示 if ( *search == - 1 ) { // テーブル内の-1に当たったら //06:10表示 // ↓table[0]の形に要修正 printf( "06:10\n\n" ); digitalLED( 610 ); } else { digitalLED( *search ); printf( "%02d:%02d\n\n", (*search / 100), // 「時」取り出し (*search % 100) ); // 「分」取り出し } fclose(file); scanf("%c", &type); // Enterで再度プログラム開始 } while (type == '\n'); } テーブルの外部ファイルは以下の様な感じです 610 650 ..... 2310 2350 -1 まだ勉強中の初心者です。汚いソースで申し訳ないです。 これでもみなさんに強力して頂きながら数日かけて、やっとここまでできました。 【困っている箇所】 ・この状態ですと、現在時間の「時」が2桁(10~23時)の場合、セグメン テーションエラーですとの表示で実行できなくなります。 ・コメントになってしまっているテーブル初期化を外部ファイル (jikoku.txt)にしたいのですが(teble[0]→6:10 teble[1]→ 6:50 ...の様に。)ファイル名を入れたり色々試したのですがなかなかで きません ・テーブル内で-1に当たったら、6:10分を表示させる箇所も、テーブル使い たいのですが、これも自分でコーディングするとコンパイルが通りませ ん。 長々と申し訳ありません。ご教授願います。 --前回ご覧頂いた方-- 結局期限を明日までにのばしてもらいました。。
- テーブル(配列)の初期化を外部ファイルに指定
お世話になっております。 以下は列車の時刻表を検索するCのソースです // ヘッダー省略 #define PRN_PORTD 0x0378 #define PRN_PORTC 0x037a void lightLED( int num, int loc ) { static int table[] = { 0x3F, // 0 0x06, // 1 0x5B, // 2 0x4F, // 3 0x66, // 4 0x6D, // 5 0x7D, // 6 0x27, // 7 0x7F, // 8 0x6F, // 9 }; // table[ num ] で数値から変換 printf("num[%x] port[%x]\n loc[%d]", able[ num ], PRN_PORTD, loc ); // デバックの為 outb( table[ num ], PRN_PORTD ); outb( loc, PRN_PORTC ); outb( loc | 0x04, PRN_PORTC ); outb( loc, PRN_PORTC ); } // 時刻表の時:分を表示する関数 void digitalLED( int time ) { int ret, four, three, two, one; four = ((time / 1000) % 10); // 4桁目を取り出す three = ((time / 100) % 10); // 3桁目を取り出す two = ((time / 10) % 10); // 2桁目を取り出す one = ((time / 1) % 10); // 1桁目を取り出す ret = ioperm( PRN_PORTD, 4, 1 ); lightLED( four, 0x03 ); // 時の10桁を表示 lightLED( three, 0x02 ); // 時の 1桁を表示 lightLED( two, 0x01 ); // 分の10桁を表示 lightLED( one, 0x00 ); // 分の 1桁を表示 ret = ioperm( PRN_PORTD, 4, 0 ); exit(0); } // ここまでのソースはLEDに表示させる関数です int main(void) { char type; int ret; do { // ↓テーブル初期化。本来はこれを使用したいのですが。 // static int table[] = { ここで外部ファイル指定 }; / int findtime; // 0000形式に変換後の現在時間 int *search; // テーブル内の検索時間 int h; // 時 int m; // 分 FILE *file; time_t timer; // 現在時刻を取得し地方形式に struct tm *local; time(&timer); // 現在時刻の取得 local = localtime(&timer); // 現在時刻を構造体に変換 h = local->tm_hour; // 時 m = local->tm_min; // 分 findtime = h * 100 + m ; // 現在時間を0000形式へ変換 file = fopen( "jikoku.txt", "r" ); if( file == NULL ) { puts( "jikoku.txtが開けません" ); return 1; } while ( !feof(file)) { fscanf(file, "%d", &*search); printf("%d\n", *search); // 該当時間検索 // for ( search = table ; *search != -1 ; search++ ) { // ↑時刻表を外部ファイルにしたことによって使わなく // なったのですが。。。 if ( *search > findtime ){ break; } } // 結果表示 if ( *search == - 1 ) { // テーブル内の-1に当たったら //06:10表示 // ↓table[0]の形に要修正 printf( "06:10\n\n" ); digitalLED( 610 ); } else { digitalLED( *search ); printf( "%02d:%02d\n\n", (*search / 100), // 「時」取り出し (*search % 100) ); // 「分」取り出し } fclose(file); scanf("%c", &type); // Enterで再度プログラム開始 } while (type == '\n'); } テーブルの外部ファイルは以下の様な感じです 610 650 ..... 2310 2350 -1 まだ勉強中の初心者です。汚いソースで申し訳ないです。 これでもみなさんに強力して頂きながら数日かけて、やっとここまでできました。 【困っている箇所】 ・この状態ですと、現在時間の「時」が2桁(10~23時)の場合、セグメン テーションエラーですとの表示で実行できなくなります。 ・コメントになってしまっているテーブル初期化を外部ファイル (jikoku.txt)にしたいのですが(teble[0]→6:10 teble[1]→ 6:50 ...の様に。)ファイル名を入れたり色々試したのですがなかなかで きません ・テーブル内で-1に当たったら、6:10分を表示させる箇所も、テーブル使い たいのですが、これも自分でコーディングするとコンパイルが通りませ ん。 長々と申し訳ありません。ご教授願います。 --前回ご覧頂いた方-- 結局期限を明日までにのばしてもらいました。。
- DirectXへの書籍について
只今、「独習C++」にてC++の勉強をしている者です。 最終的にはDirectXでのゲームプログラミングをしてみたいと思っているのですが、 どのような書籍をつかってステップアップしていけばいいのでしょうか?おすすめの書籍をお願いします。 ※開発環境は今は「BccDeveloper」で近日中に「VisualStudio」を購入予定です。 独習C++ → ??? → ・・・・・・・
- c++におけるtemplateについて
c++の自作templateを関数宣言部と関数定義部とで、ファイルを分割する事を考えているのですが、エラーが出てtemplateをincludeすることが出来ないでいます。 例えば、 <ファイル:test.H> #ifndef test_H #define test_H #include <iostream> template<class T> class test { private: int row_, col_; public: test( int , int ); }; #endif <ファイル test.C> #include "test.H" template<class T> test<T>::test(int a, int b) :row_(a), col_(b) { std::cout << "コンストラクター" << std::endl; } <ファイル main.C> #include "test.H" #include<iostream> int main() { test a( 3, 3) return 0; } のようにtemplateファイルを分割した場合、 undefined reference to `test<double>::test(int, int)' collect2: ld returned 1 exit status のようなエラーがでます。 書籍:新c++言語入門・シニア編(下)の29章には「export」を関数定義部に付ければ良いような記述がありましたが、エラーを解決することが出来ませんでした。 main.Cにて、test.Cをインクルードするとこの問題を回避することが出来るのですが・・・。 そもそもtemplateは上記のように宣言部と定義部とを別々のファイルにすることはできないのでしょうか?
- 数値計算法を勉強しているんのですが…
Shimpson公式を用いて計算したときに何故mが大きいところで誤差が大きくなりました。プログラムは下に示しました。なぜこのような結果になったか分かりません。 #include <stdio.h> #include <math.h> #define PI 3.141592653589793 double sum(long m) { double n,sum,h,x; h=(PI/2)/m; sum=0; n=0;x=0; while( n<m ){ sum+=2*sin(x);/*項の加算*/ sum+=4*sin(x+h/2); n++; x+=h; } sum+=-sin(0)+sin(PI/2); sum*=h/6; return sum; } int main(void) { double s; long m; int i; m=1; for(i=0;i<8;i++){ s=sum(m); printf("%2d m=%10ld sum= %22.16e err= %22.16e \n",i,m,s,s-1.0); m*=10;/*次のmは10倍*/ } return 0; }
- DLLの明示的な読み込みの方法
開発環境:WindowsXP sp2 + VisualStudio2005 MSDNやその他のWebページで、DLLの明示的なロードについて勉強しています。 試しに以下のようなコードを書いてみたのですが、コンパイルは通りますが、実行時にDLLが読み込まれているのにもかかわらず、関数のアドレスが取得できません。 ---DLLのコード--- #include <iostream> using namespace std; __declspec(dllexport) void printMessage() { cout<<"printMessage関数が呼ばれた"<<endl; } ---終わり--- コンパイルしたDLLのみをDLLを使用した実行形式がコンパイル後に収納されるフォルダに移動して、以下のコードを書いてコンパイルしました。 ---EXEのコード--- #include <windows.h> #include <iostream> typedef void(*TFUNC)(); int main(void) { HINSTANCE hInstDLL; TFUNC DllFunction; //DLLの読み込み hInstDLL=LoadLibrary(L"dll.dll"); if(hInstDLL==NULL) { std::cout<<"ERROR"<<std::endl; return 0; } //printMessage関数のアドレスを取得 DllFunction=(TFUNC)GetProcAddress(hInstDLL,"printMessage"); //この辺りがおかしいかも知れない //関数の使用 if(DllFunction==NULL) { std::cout<<"ERROR"<<std::endl; FreeLibrary(hInstDLL); return 0; } DllFunction(); //DLLの解放 if(!FreeLibrary(hInstDLL)) return 0; return 0; } ---終わり--- DLLは見つかる物の、どうも上手くいかないようです......原因は何なのでしょうか。
- fgetsを使って入力した文字列を読み込む。
こんにちは。私は30代の男性です。 上司から、「C言語でコーディングする際にscanfは使わずにfgetsを使うように」との指示があったのですが、scanfしか使ったことがないので、具体的にどうコーディングすればいいのかわかりませんでした(聞いても教えてもくれず…)。どのようにすればfgetsを使って入力した文字列を読み取れるのか、わかる方がいらっしゃれば簡単な例文で教えて頂けるとありがたいのですが。 どうぞ宜しくお願い致します。
- VC++でデバックはどうやるの?
現在VisualStudio2005を使用しています。 新規プロジェクトを作るとき、 [全般]-[空のプロジェクト] で使用しているのですが、これではデバックが出来ないのでしょうか? デバックありで実行出来るようにするには、プロジェクトをどのように作ればいいのでしょうか? 基本的な質問でごめんなさい><;