トップページ⇒tech
983コメント325KB

C統合・質問スレッド

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
いろんなスレが乱立していますが、統合的なスレッドがないので立てました。
質問もOK

関連スレ
C#って死滅する理由がないよね! Part4
http://pc2.2ch.net/test/read.cgi/tech/1042464104/
C#最強伝説
http://pc2.2ch.net/test/read.cgi/tech/1061208152/
C#とJava、どっちをおぼえればいいの?
http://pc2.2ch.net/test/read.cgi/tech/1006715468/
C#Builder Professional 質問箱
http://pc2.2ch.net/test/read.cgi/tech/1062433418/

関連リンク
http://dir.yahoo.co.jp/Computers_and_Internet/Software/Programming_Tools/Programming_Languages/C_Sharp/
0153デフォルトの名無しさんNGNG
>>152
sosuu[1]に何も値を代入してないから。
> sosuu[n+1] = sosuukouho;
と
> m += 1;
の間に
printf("n = %d, m = %d, sosuu[%d] = %d\n", n, m, n+1, sosuu[n+1]);
を入れて確認してみ
0154151NGNG
>>153さんわかりました。

if((sosuukouho % sosuu[n] != 0) && (n == m)) の部分の

(n==m)ここが原因だったんですね

(n==m-1)としたら直りました。

ここが影響したので
printf("素数の数は%d個で、最後の素数は%dです。\n",m,sosuu[m]); を

printf("素数の数は%d個で、最後の素数は%dです。\n",m,sosuu[m-1]);

になおして無事意図したとおりに動くようになりました。
ありがとうございました。

0155デフォルトの名無しさんNGNG
なーんでこのすれは閑古鳥がないてんだよう
0156デフォルトの名無しさんNGNG
>>155
それは、このスレの存在自体が「間違い」だから。
正しくはスレタイをミスっただけなんだが、そのミスが致命的なミスだったわけで・・・。
0157155NGNG
んじゃ、お気に入りから削除しますね
0158149NGNG
二次元配列のポインタの宣言しかたがわかりません

char a[2][2],*ptr,*ptr2

ここから自分なりに考えてもコンパイルエラーになります。
0159デフォルトの名無しさんNGNG
>>158
char (*pa22c)[2][2]; /* 2次元配列へのポインタ */
char *a22pc[2][2]; /* ポインタの2次元配列 */
0160デフォルトの名無しさんNGNG
>>159

�dクス
0161160NGNG
またまたポインタの質問です

*(pointa + (指定一次元添字 * 二次元要素数) + 指定二次元添字) 某C講座から

上の指定一次元添字と二次元要素数というのはどういう意味なんでしょうか?
指定一次元添字が指定する一次元の配列番号なんですか?

日本語おかしいです。スミマセン
0162デフォルトの名無しさんNGNG
type array[N][M];
type *p = array;
array[4][12] = *(p + 4 * N + 12);
0163デフォルトの名無しさんNGNG
>>161

pointa[N * M]; /* pointa[N][M]; みたいに使う */
/* ... */
  a = pointa[i * M + j]; /* a = pointa[i][j]の代わり */

なので、
i : 指定一次元添字
j : 指定二次元添字
M : 二次元要素数
と思われます。
0164160NGNG
M+jとするのはなぜなんでしょうか?
0165デフォルトの名無しさんNGNG
>>164
M + jじゃなくて
(i * M)そこに + j している感じで
0166160NGNG
#include <stdio.h>
#include <conio.h>

int main()
{
int *ptr;
int a[2][2],b;

*ptr = a;

a[1][2]=5;

b=*ptr[1*2+1];

printf("%d",b);
getch();
}
0167160NGNG
アァ・・・
まちがえて送信してしまった・・・
166のソースがコンパイルできません

int ( *)[2]型はint型に変換できない
無効な間接参照

の二つです。
0168デフォルトの名無しさんNGNG
*p: int型
a: int(*)[2]型
b: int型
*p[1*2+1]: int*型
0169デフォルトの名無しさんNGNG
*p[1*2+1]はおかしい。
これは*(p[1*2+1])と解釈され、p[1*2+1]の型はintだから、*を適用できない。
無効な間接参照とはこのことだろう。
0170デフォルトの名無しさんNGNG
*p[1*2+1]はおかしい。
これは*(p[1*2+1])と解釈され、p[1*2+1]の型はintだから*を適用できない。
無効な間接参照とはこのことだろう。
0171160NGNG
>168
ptr=(int *)a;
としてなかったのが原因ですか。

ptr=(int *)a;
*ptr[1*2+1]=70 とやると失敗します。
*(ptr + (1*2)+1)=70とすると動くんですが・・・。

あと*(ptr + (1*2) + 1)とするとptrに(1*2)+1を足してますがptrはどんどん増えていかないのでしょうか?


0172160NGNG
>168
ptr=(int *)a;
としてなかったのが原因ですか。

ptr=(int *)a;
*ptr[1*2+1]=70 とやると失敗します。
*(ptr + (1*2)+1)=70とすると動くんですが・・・。

あと*(ptr + (1*2) + 1)とするとptrに(1*2)+1を足してますがptrはどんどん増えていかないのでしょうか?


0173160NGNG
>168
ptr=(int *)a;
としてなかったのが原因ですか。

ptr=(int *)a;
*ptr[1*2+1]=70 とやると失敗します。
*(ptr + (1*2)+1)=70とすると動くんですが・・・。

あと*(ptr + (1*2) + 1)とするとptrに(1*2)+1を足してますがptrはどんどん増えていかないのでしょうか?
0174デフォルトの名無しさんNGNG
>>166 のソースを正しくとこうなるんだよね
(便宜上aは初期化させてくれ)
#include <stdio.h>
#include <conio.h>
int main()
{
int (*ptr)[2], a[2][2] = {{0, 1}, {2, 3}},b;

ptr = a;

a[1][2]=5;

b=ptr[1][1];

printf("%d",b);
getch();
}

0175160NGNG
なんか3回も書き込んである・・・orz

>>174
おお ありがとうございます。

(*ptr)[2]は*ptrの変数配列ですか?

ptr[1][1]と*(ptr+(1*2)+1)ではどっちの方が処理早いですかね?
0176デフォルトの名無しさんNGNG
>>175
最適化でどっちも同じになるだろ
0177デフォルトの名無しさんNGNG
>>175
>(*ptr)[2]は*ptrの変数配列ですか?
>>159参照。
ptrはint[2]へのポインタ。

>ptr[1][1]と*(ptr+(1*2)+1)ではどっちの方が処理早いですかね?
この二つは全く意味が違う。
後者はptr[3]と同じで、型はintの配列。
0178177NGNG
>>160が理解していないと思われることを補足しておく。
必要がなかったらスルーしてくれ。

まず、二次元配列は、配列の配列である。つまり、
int arr[2][3];
という宣言があるとき、arr[0]やarr[1]はintの配列で、要素数は3である。
ここで、配列はその先頭要素へのポインタに変換されることを思い出して欲しい。
だから、arrはarr[0]へのポインタに変換される。arr[0]はintの配列だから、
変換された後のarrはintの配列へのポインタ、つまり型はint (*)[3]である。
int (*)[3]型の変数pを宣言するにはint (*p)[3];と書く。これが、>>174で
ptr = a;
が正しくコンパイルされる理由だ。

次に、配列の要素を指しているポインタに整数nを足すと、
はじめに指していた要素のn個先の要素を指すポインタができる。
これは、その配列が、配列への配列(二次元配列)であっても同じことである。
だから、>>174の例で*(ptr+(1*2)+1)と書くと、ptrの三番目の要素が得られる。
実際にはptrには二つの要素しかないから、この結果は意味を成さない。

最後に、配列はメモリ上で、各要素が隙間なく並べられる。たとえば、
int arr[2][3];
と宣言した場合、arr[0]とarr[1]が隙間なく並べられる。
このとき、arr[0]やarr[1]も配列だから、これらの各要素も隙間なく並べられる。結果的に、
arr[0][0] arr[0][1] arr[0][2] arr[1][0] arr[1][1] arr[1][2]
と並ぶことになる。
この並びを一次元配列とみなしてアクセスするのが、>>161の方法である。
このとき、一次元配列の各要素はintであることに注意してくれ。
これを実現するには、添え字を一次元配列用に計算してarr[0][0]へのポインタに足せば良い。
arrはarr[0]へのポインタであってarr[0][0]へのポインタではないから、そのままでは使えない。
そこで、素直に&arr[0][0]と書くか、(int *)arrと強引にキャストする。
0179177NGNG
#include <stdio.h>
#include <conio.h>
int main()
{
int *p, a[2][2] = {{0, 1}, {2, 3}},b;

p = &a[0][0]; /* p = (int *)a;と書いても同じ */

a[1][1] = 5; /* a[1][2]は配列の外 */

b = *(p + (1*2+1)); /* b = p[1*2+1]; と書いても同じ */

printf("%d",b);
getch();
}

>>160がやりたかったのはこれかな?
0180160NGNG
>177-179
おお 分かりやすい説明ありがとうございます。
p=&arr[0][0]の方法は2次元以上の配列だと楽ですね。

0181デフォルトの名無しさんNGNG
調べても分からなかったんで教えてください。

イーサネット接続するときに connect()を使うわけですが
これのタイムアウト値を設定したいときどうすればよいのでしょうか。
settimeoutとか見かけたけど使い方が分かりませんでした。
0182デフォルトの名無しさんNGNG
連立方程式を解くプログラムを教えて下さい〜!

ax+by+c=0
dx+ey+f=0

のときx,yをとくような奴です。

C言語でおながいいいい
0183デフォルトの名無しさんNGNG
>>182 代数・幾何学の勉強しなさい。逆行列を作れば簡単に解ける。
理系の大学生なら授業でやると思われ。
0184デフォルトの名無しさんNGNG
初めまして。色々と試しているのですが、プログラムが作れません。
よろしければ、教えてください。
「チーム研究発表会の評価を集計するプログラムを作る。3人以内の学生メンバーで構成される4
チームが発表会に参加する。評価は調査内容、提案内容、発表資料、発表方法の4つのポイントで
行われ、各々のチームに対して合計点数が付けられる。」
1.評価に必要なデータを全て含むようなチームを表す構造体を作成し、typedefで名前を付けよ。
  変数名はできる限り理解しやすいものを考え、各チームのメンバーのフルネームと学籍番号も
  分かるようにすること。また、各チームにはチーム番号をつけよ。

という物なのですが、ここまで指定されていたら作れるのが当たりまえなのかもしれませんが、初心者
なものでほぼ手につきません。よろしければ、ヒント的なものでもかまわないので教えてください。
0185デフォルトの名無しさんNGNG
>>184

ヒント
こちらで聞いたほうがいいでしょう。

ぼるじょあがC/C++の宿題を片づけますYO! 25代目
http://pc5.2ch.net/test/read.cgi/tech/1087929711/l50

書き込む前に
http://pc5.2ch.net/test/read.cgi/tech/1087929711/1
を読むことをお忘れなく。
0186184NGNG
>>185
ありがとうございます。そちらの方で聞いてみます。
0187デフォルトの名無しさんNGNG
質問です.
循環リストの長所と短所と、どのようなアプリケーションに
循環リストは向いているかを教えてください。
0188デフォルトの名無しさんNGNG
すみません。

C言語 dos で
msecの時間を表示したいのですが、
どのようにすればよいでしょうか?

よろしくお願いします。
0189デフォルトの名無しさんNGNG
>>1
> いろんなスレが乱立していますが、
お前が言うことではないな。
0190デフォルトの名無しさんNGNG
C/C++ でフリーのライブラリとかでperl相当の正規表現処理
とかテキスト処理とかしてくれるようなものって存在しませんか?
あるいはperlのスクリプトをそのまま使えるような・・・
フリーで無ければ有料でも構いませんが。
0191190NGNG
age忘れました
0192デフォルトの名無しさんNGNG
>>190
C++ならboostでも使っとけ
0193190NGNG
紹介thx.
0194デフォルトの名無しさんNGNG
LSI C-86 超簡単セットアップの  
Setlsic.batを実行したんですが
LSI C-86試食版をF:\LSIC86にセットアップします。
と表示されてドライブを指定できません。
何ででしょうか?
0195デフォルトの名無しさんNGNG
>>194
そのSetlsic.batとやらを直接書き換えてみたらどうだ?
0196デフォルトの名無しさんNGNG
今Cのコンパイラしかないプラットフォームで開発をしていまして、
もともとC++で書いていたコードを移植しています。
クラスになっている箇所は、C++のクラスみたいに、

struct AbstractClass{
 int (*funcA)(void);
 int (*funcB)(void);
 int (*funcC)(void);
};

struct ConcreteClass{
 struct AbstractClass _super;
};


という風に仮想関数テーブルみたいなものを作ってるんですが、

struct ConcreteClass c;
struct AbstractClass *abstract;

abstract = (struct AbstractClass*)c;
abstract->funcA(abstract);

とかいちいち先頭に呼び出しのオブジェクトを入れたりするのが面倒だったり、
構造体のメンバのスコープを限定できなかったり、と色々不便です。
C++みたいなシンタクス(仮想関数テーブルとか構造体のメンバのスコープの限定とか)で書けて、
普通のC言語のコードを吐き出してくれるパーサーとかないでしょうか?
以前、昔のC++コンパイラは一旦Cのコードに変換してからコンパイルしていた、と読んだのですが、
今でもそのようなものはありますでしょうか?
0197デフォルトの名無しさんNGNG
今Cのコンパイラしかないプラットフォームで開発をしていまして、
もともとC++で書いていたコードを移植しています。
クラスになっている箇所は、C++のクラスみたいに、

struct AbstractClass{
 int (*funcA)(void);
 int (*funcB)(void);
 int (*funcC)(void);
};

struct ConcreteClass{
 struct AbstractClass _super;
};


という風に仮想関数テーブルみたいなものを作ってるんですが、

struct ConcreteClass c;
struct AbstractClass *abstract;

abstract = (struct AbstractClass*)c;
abstract->funcA(abstract);

とかいちいち先頭に呼び出しのオブジェクトを入れたりするのが面倒だったり、
構造体のメンバのスコープを限定できなかったり、と色々不便です。
C++みたいなシンタクス(仮想関数テーブルとか構造体のメンバのスコープの限定とか)で書けて、
普通のC言語のコードを吐き出してくれるパーサーとかないでしょうか?
以前、昔のC++コンパイラは一旦Cのコードに変換してからコンパイルしていた、と読んだのですが、
今でもそのようなものはありますでしょうか?
0198デフォルトの名無しさんNGNG
C++の方のオプションで出来たような希ガス
0199デフォルトの名無しさんNGNG
>>196
今まともに使えるのはないっぽい。
0200196NGNG
>>198
gccのman見たけど見つからなかった。
どのコンパイラで使えるかご存知でしたら教えていただけませんか?

>>199
一部機能が使えない(関数のオーバーロードとか)くらいなら問題ないんですが、
プリプロセスの結果が怪しい、ってことでしょうか?
0201デフォルトの名無しさんNGNG
>>197
>普通のC言語のコードを吐き出してくれるパーサーとかないでしょうか?

普通、そういうのは「パーサー」と呼ばず「トランスレータ」と呼ぶ。
後は自分で調べれ。
0202デフォルトの名無しさんNGNG
gccの環境ってどこでDLすればいいんでしょうか?
ググッたけれど見つからないので(´・ω・`)
0203デフォルトの名無しさんNGNG
>>202
Windows?Linux?
0204202NGNG
Windowsです。
そろそろLinuxに移行しようと思ってるのでLinuxも教えていただければ幸いです。
0205デフォルトの名無しさんNGNG
>>204
WindowsならCygwinをインストールするときにgccを指定できるし、
MinGWというフリー環境もある。
Linuxだと大抵のディストリビューションに付属しているので特に問題はないと思う。
debianなどのディストリビューションでは初めから入っているわけではないが、
apt-getなどのツールで一発でインストールできる場合がほとんどなので、
Linuxの場合は開発環境に悩まされる事はほとんどないと思うよ。
0206デフォルトの名無しさんNGNG
>>205
即レスありがとうございます。
Cygwinを入れたときに指定していなかったらしいのでMinGWを使ってみます。
0207デフォルトの名無しさんNGNG
>>206
もう一度Cygwinのセットアッププログラムを実行して、gccを指定すれば
そのままインストールできるけれど。
再インストールではなく追加インストールになる。
0208デフォルトの名無しさんNGNG
>>207
MinWinでどれをDLしてよいかわからなかったのでCygwinのほうでやってみます。
とりあえずパッケージ選択時に全部選択しました。疲れたorz
0209デフォルトの名無しさんNGNG
Cygwinはデフォルトでgcc3.3.3だから、3.4入れたければ設定替えないとね
0210196NGNG
>>201
ありがとうございまつ。

探したけどもう全然ないんですね(´・ω・`)
0211デフォルトの名無しさんNGNG
>>210
Objective-Cならトランスレーターがあるが・・・
0212デフォルトの名無しさんNGNG
プログラマさんからみて、unixのソースコードってどうなんでしょう?
インターフェース関係ぐらいしか読んでないのでわかりませんが、
やっぱりプロはすごい。
0213デフォルトの名無しさんNGNG
#include <stdio.h>

main ()
{
int res;
char ans;

printf("何番目を選びますか?\n");
printf("整数を入力してください。\n");

scanf("%d",&res);

if(res == 1)
ans = 'A';
else
ans = 'B';

printf("%cコースを選択しました。\n",res);

return 0;
}


って本に書いてたんでコンパイルしようとしたら
ansに代入した値は使われていない。
と表示されてコンパイルできません。
なんででしょうか?
0214デフォルトの名無しさんNGNG
printf("%cコースを選択しました。\n",res);
 ↓
printf("%cコースを選択しました。\n",ans);
0215213NGNG
>>214
ありがとうございます。
できました。
これで先に進めます。
0216215NGNG
すいません。
次のsampleもできません。
内容は
#include <stdio.h>

main ()
[
int res;
char ans;

printf("何番目を選びますか?\n");
printf("整数を入力してください。\n");

scanf("%d",&res);

ans = (res==1) ? 'A' : 'B';

printf("%cコースを選択しました。\n",ans);

return 0;
}

というのものですがどこが変なんでしょうか?
0217デフォルトの名無しさんNGNG
>>216
main()の直後の [ を { へ。
0218216NGNG
>>217
コンパイルできました。
こんな質問にも答えてくれてありがとうございます。
0219デフォルトの名無しさんNGNG
目の前にあるバグが見えるか見えないかは経験の問題だからな
0220196NGNG
>>211
禿しくありがとう!!
試してみまつ。
0221デフォルトの名無しさんNGNG
�@for(i=0;i<5;i++)
�Afor(i=0;<=5;i++)

�@は0,1,2,3,4と5回
�Aは0,1,2,3,4,5と6回繰り返す
という意味合いでいいんですか?
0222デフォルトの名無しさんNGNG
あげさせてもらいますよ
0223デフォルトの名無しさんNGNG
>>222
氏ね
0224デフォルトの名無しさんNGNG
>>221
それであっている。
0225デフォルトの名無しさんNGNG
�Aは違う
0226デフォルトの名無しさんNGNG
いまくだらんプログラム作っていまして、ビルドしたらエラーが12・・・orz
何回も見直したんですが、原因が見いだせなくて・・・
初歩ですが、どうかよろしくお願いいたします。
/*shm.c*/
#include<stdio.h>
#include<conio.h>

int main(void){
int age;
int seito;
printf("▼はENTERを押してください。\nまた、INPUT[というのが出た場合は、整数値を入力してENTERを押してください\n");
printf("A:ちょっと聞きたいことがあるんだよ。いいかな?.....▼\n");
getch();
printf("A:一応、自分刑事で、極秘の捜査中でね。秘密だよ。お願いがあるんだけど年齢教えてくれないかな?▼\n");
getch();
printf("俺の年齢は......INPUT[");
scanf("%d", &age);
printf("俺の年齢は%dです。", age);
printf("A:ありがとう。%d歳なんだね。ところでMONEY IS LIFEという学校をしているかい?捜査中で必要な情報なんでね。知らないか?▼\n",age);
   getch();
printf("自分がその学校の生徒ということを教える.....YES=1 NO=0.....INPUT[");
scanf("%d", &seito);
0227226NGNG
if(age >= 15){
printf("A:ありがとう。君は好青年だね。ところでお金をくれないか?あぁ?残念だったな。いろいろ教えてくれてありがとうよ。あとは金奪ってサヨナラだ。( ゚Д゚)イッテヨシ!▼\n");
}else if(seito == 1){
printf("A:ありがとう。君は好青年だね。ところでお金をくれないか?あぁ?残念だったな。いろいろ教えてくれてありがとうよ。あとは金奪ってサヨナラだ。( ゚Д゚)イッテヨシ!▼\n");
}else{
printf("A:いろいろ教えてくれてありがとう。じゃぁマタね。▼\n");
}
getch();
printf("こういう奴には気をつけよう▼!\n");
  getch();
printf("おわり。▼\n");
return 0;
}
0228221NGNG
ほかのスレで聞いてきます
0229デフォルトの名無しさんNGNG
カワイソウナショウネン…
0230デフォルトの名無しさんNGNG
>>225
違うかのか?
0231デフォルトの名無しさんNGNG
>>230
とりあえずコンパイルできなかった
0232デフォルトの名無しさんNGNG
>>231
すいませんでした。
0233デフォルトの名無しさんNGNG
goto文って飛べるの関数内だけだけでしたっけ?
その場合にかなり深い位置にある関数内からmainのある位置に戻すいい方法ってありますか?
0234デフォルトの名無しさんNGNG
>>233
setjmp,longjmp
0235デフォルトの名無しさんNGNG
>>233
gotoは関数内のみ。 もっと飛ぶならlongjmp。
0236デフォルトの名無しさんNGNG
>>233
setjmp と longjmp でいけます。
0237233NGNG
>>234-236
ありがとうございます
0238デフォルトの名無しさんNGNG
>>226 はスルーなのか・・・
「人工無能」でぐぐってくれ
0239デフォルトの名無しさんNGNG
   getch();
0240デフォルトの名無しさんNGNG
再確認。

  こ こ は ス レ タ イ ト ル を ミ ス っ た C ♯ ス レ で す にょ
0241デフォルトの名無しさんNGNG
0242デフォルトの名無しさんNGNG
UnixとWindows両方で使えるCのZip操作ライブラリが欲しいんですが、どんなのがありますか?
zipという単語が一般的過ぎてぐぐってもノイズばかり…
0243デフォルトの名無しさんNGNG
重複スレ

= = = = = = = = = = = 終 了 = = = = = = = = = = =
0244デフォルトの名無しさんNGNG
じゃあ本スレってどこ?
0245デフォルトの名無しさんNGNG
>>244
http://pc5.2ch.net/test/read.cgi/tech/1104114259/
0246デフォルトの名無しさんNGNG
>>242
zlibでいいんじゃないの? Windows端末でもCygwin使えば使えるし。
0247デフォルトの名無しさんNGNG
とりあえずexeファイル作りたいんですが
どうすればいいんですか。
0248デフォルトの名無しさんNGNG
>247
解決
0249247NGNG
>>248
ありがとうございます。
それを使ってみます。
0250デフォルトの名無しさん05/02/03 00:21:32
マルチメディアタイマを使って、8Hz(125ms周期)にある関数を起動させたいのですが、
方法(できればコード)を教えて下さい。
0251デフォルトの名無しさん05/02/03 00:42:03
while(1){foo();sleep(125);}
0252デフォルトの名無しさん05/02/03 02:59:07
>>251
煽りはいいけど、マルチメディアタイマ使ってないですね。
■ このスレッドは過去ログ倉庫に格納されています