C言語なら俺に聞け(入門篇) Part 16

このエントリーをはてなブックマークに追加
801デフォルトの名無しさん
乱数のプログラムですが、
time関数を使うために
srand((unsigned int)time(NULL));
を使うとコンパイル時に 未定義のシンボルNULLとエラーがでてしまいます。
どうすればよいでしょうか。
802デフォルトの名無しさん:2007/07/22(日) 16:41:00
>>801
使用している環境は?stdio.h やら stdlib.h あるいは iostream など取り込んでいるか?
803デフォルトの名無しさん:2007/07/22(日) 16:41:47
#インクルード タイム。h
って書いた?
804デフォルトの名無しさん:2007/07/22(日) 16:42:24
NULLなんて使うな。0って書け。
805デフォルトの名無しさん:2007/07/22(日) 16:53:52
801ですが、ソースコードです。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int GetRandom(int min,int max);

int main(void)
{
int i;

srand((unsigned int)time(NULL));

for (i = 0;i < 30;i++) {
printf("%d\n",GetRandom(0,50));
}

return 0;
}

int GetRandom(int min,int max)
{
return min + (int)(rand()*(max-min+1.0)/(1.0+RAND_MAX));
}
0から50までの乱数を30個発生させるというものです。
806デフォルトの名無しさん:2007/07/22(日) 17:05:22
それで NULL が使えないのか・・・。
なら stddef.h でもインクルードしとけ。
807デフォルトの名無しさん:2007/07/22(日) 17:08:15
どこの処理系だよ。
808デフォルトの名無しさん:2007/07/22(日) 17:08:40
なんで 0 じゃだめなのか?>>805
809デフォルトの名無しさん:2007/07/22(日) 17:12:33
<stddef.h > インクルードしましたがやはりエラーは消えませんでした。
808様 0に変えることでコンパイル成功しました。ありがとうございます。
810デフォルトの名無しさん:2007/07/22(日) 17:13:34
>>809
OSとコンパイラを教えてください
811デフォルトの名無しさん:2007/07/22(日) 17:14:36
0 にすれば問題はないけど、
NULL が使えないというその処理系は凄く気持ち悪いな。
他にも変な所がありそうで怖い。
812デフォルトの名無しさん:2007/07/22(日) 17:16:24
そのプロジェクトはいったん忘れて

nulltest.cってファイル作って下のソース書いて実行してみたら。
これで通らなかったから根本的なところでなんかおかしい。
#include <stdio.h>
int main(){ return (int)NULL; }
813デフォルトの名無しさん:2007/07/22(日) 17:21:08
安易な解決法を提示したがために、
後々困ることにならない事を祈る。
814デフォルトの名無しさん:2007/07/22(日) 17:21:50
Cコンパイラ:Borland C++ Compilerを使っています。
812様のソース実行しましたが、やはりエラーがでてしまいました
815デフォルトの名無しさん:2007/07/22(日) 17:24:43
バージョンが古すぎるんじゃね?
#define NULL 0でも書いて対応するしかなさそ。
816デフォルトの名無しさん:2007/07/22(日) 17:30:19
確かに古いのかもしれません。
#define NULL 0 と書いたら NULLが使えるようになりました!
色々とご指摘ありがとうございます
817デフォルトの名無しさん:2007/07/22(日) 17:30:24
いくらバージョンが古くても、NULL がないってことあるのかなあ。
インストール手順で何かミスがあったとしか・・・。

NULL が使えないってことは、size_t とかも使えないんだろうか。

#include <stddef.h>
int main() { return (int)(size_t)0; }

は通る?
818デフォルトの名無しさん:2007/07/22(日) 17:34:52
817様のソースは 通りました
インストール手順は、他のでは上手くいくのでミスはないかと・・・
819デフォルトの名無しさん:2007/07/22(日) 17:39:08
size_t は使えるのか・・・。
NULL だけ使えないって何か不思議だなあ。
まあ、NULL だけ使えないみたいだから、
自前で定義するか 0 を直接使うかってところか・・・。

stddef.h を探して NULL の定義を直接埋め込んだのでもいいとは思う。
820デフォルトの名無しさん:2007/07/22(日) 17:39:45
そのウンココパイラ捨てろw
821デフォルトの名無しさん:2007/07/22(日) 17:46:25
ヘッダファイル内でNULLを検索してみては
変な所にあるかもしれないし…
822デフォルトの名無しさん:2007/07/22(日) 17:46:36
行列matの転置行列を求めて次のように出力するプログラムを完成させよ。

| 1 6 11 16 21 |
| 2 7 12 17 22 |
| 3 8 13 18 23 |
| 4 9 14 19 24 |
| 5 10 15 20 25 |
823デフォルトの名無しさん:2007/07/22(日) 17:48:29
#include <stdio.h>
#define MSIZE 5
void swap(int *a, int *b) {
int c;
(a) = *a;
*a = *b;
*b = (a) ;
}
void main(void) {
int i, j, mat[MSIZE][MSIZE] = { { 1, 2, 3, 4, 5},
{ 6, 7, 8, 9,10},
{11,12,13,14,15},
{16,17,18,19,20},
{21,22,23,24,25} };
for(i = 0; i < MSIZE - 1; i++) {
for(j = (b) ; j < (c) ; j ++) {
swap( (d) , (e) );
}
}
for(i = 0; i < MSIZE; i ++) {
printf("|");/25小計
for(j = 0; j < MSIZE; j ++) {
printf("%3d ", mat[i][j]);
}
printf(" |\n");
}
}

さっぱりわかりません
よろしくお願いします
824デフォルトの名無しさん:2007/07/22(日) 17:49:31
size_t だの time_t だの、定義を見ると符号なしの整数型だしな
まぁ、自分で適当にそれに応じて使っておけってことで
825デフォルトの名無しさん:2007/07/22(日) 18:10:49
あるカップラーメンの値段を店ごとに調べた.それを配列に
入れて,下の出力のように10円刻みに分布をとることを考える.
そのためのプログラムを下に示す.空白を補え.

80- 89円: 2
90- 99円: 2
100-109円: 1
110-119円: 2
120-129円: 1
130-139円: 2
826デフォルトの名無しさん:2007/07/22(日) 18:13:33
#include <stdio.h>
#define C_NUM 6
 
void makedist(int a[10], int b[C_NUM]) {
int i;
 
for(i = 0; i < 10; i ++) {
b[ (a) ] += 1;
}
}
 
void main(void) {
int price[10] = {80, 120, 111, 130, 139, 95, 98, 89, 105, 119};
int dist[C_NUM], i;
 
for(i = 0; i < C_NUM; i++) {
dist[i] = (b) ;
}
makedist( (c) , dist);
for(i = 0; i < C_NUM; i++) {
printf("%3d-%3d円: %3d\n", (d) ,
(e) , dist[i]);
}
}

これもさっぱりです・・・
教えてください
827デフォルトの名無しさん:2007/07/22(日) 18:20:47
さっぱりって言われると何教えていいか分かんないよ
先生にでも聞いたら?
828デフォルトの名無しさん:2007/07/22(日) 18:22:04
簡易CG作成のプログラムなんですけど、
円を作ってそれを移動、壁で反射、色が点滅などやらなければいけなくて
移動までは出来るようになったんですが後がさっぱりでs

助けてくだしあ><
829デフォルトの名無しさん:2007/07/22(日) 18:26:03
>825
宿題の答えが知りたいだけなら、宿題スレ行けよ
830デフォルトの名無しさん:2007/07/22(日) 18:45:28
私も冷たいシャワーを浴びてさっぱりです
831デフォルトの名無しさん:2007/07/22(日) 20:15:39
ファイルのオープンに関して質問させてください
文字列を名前にした場合
FILE = *fp;
str[100] = "abc.txt";
fp = fopen(str,"r");

で行けるのですが、ファイル名を数列にしたい場合
どうすればいいのでしょうか?
例えばファイル名(0〜2.txt)
int i;
for(i=0; i<=2; i++){
fp = fopen(????,"r");
}

????の部分に文字列のアドレスを入力してやれば
いいのだと思いcharにして&iとかしてみましたが上手くいきません

結構悩んだのですがさっぱりです!!
解説よろしくお願いします
832デフォルトの名無しさん:2007/07/22(日) 20:17:34
sprintf使え
833デフォルトの名無しさん:2007/07/22(日) 20:23:11
>>831
char buf[100];
int i;
for(i=0;i<=2;i++) {
sprintf(buf,"&d.txt",i);
fp = fopen(buf,"r");
//
}
834833:2007/07/22(日) 20:23:46
失敗
×sprintf(buf,"&d.txt",i);
○sprintf(buf,"%d.txt",i);

835デフォルトの名無しさん:2007/07/22(日) 20:34:36
bccだが>>812問題なかったぞ
バージョンは5.5.1
836デフォルトの名無しさん:2007/07/22(日) 20:53:17
>>832 >>834 >>835
ありがとうございます!!
凄い悩んでたのがスッキリしますた
sprintf活用してみます
837デフォルトの名無しさん:2007/07/22(日) 20:54:19
全くの初心者です。
います。C言語の基礎の基礎という本に添付されたCDに入っていたLSI Cを使ってプログラム
のコンパイルをしようとしています。書かれていたプログラムをSample1.c
という名前で保存しました。コマンドプロンプト画面で
C:\CGENGO\PRACTICE>DIRを入力して調べると469 Sample1.cが保存されて
いるのが分かります。
同じ画面でC:\CGENGO\PRACTICE>Lcc Sample1と入力しても
SAMPLE.EXEが作成されません。どうしたらよいか教えてください。
838デフォルトの名無しさん:2007/07/22(日) 20:58:32
C言語どころかパソコン初心者…?
まずその本に書かれている通り導入したのか?
839デフォルトの名無しさん:2007/07/22(日) 21:00:00
Windows 環境変数 PATH
でぐぐる
840デフォルトの名無しさん:2007/07/22(日) 21:26:55
>>837
マジで悪いことは言わないからLSI-Cはやめてbccかgcc(MinGW)にしとけ。
乗りかえるの今からでも全く遅くないから。
841デフォルトの名無しさん:2007/07/22(日) 21:33:39
>>837
VisualC++2005ExpressEditionでもいいぞ
842デフォルトの名無しさん :2007/07/22(日) 21:50:12
VisualC++2005ExpressEditionは初心者が
C学ぶのに使うと、ANSI Cの標準関数で
非推奨な関数(scanfとか)使うとwarrningでまくりで
混乱するんじゃないか?
843デフォルトの名無しさん:2007/07/22(日) 21:53:10
コピペしてそのままデバッグすると、モノによるが一瞬で消えるしな
844デフォルトの名無しさん:2007/07/22(日) 21:58:16
皆さんありがとう。参考にさせていただきます。(初心者)
845デフォルトの名無しさん:2007/07/22(日) 22:42:45
>>829
すいません、教えて欲しいんです。
自分でできるようになりたいです。
846デフォルトの名無しさん:2007/07/22(日) 22:44:36
どうして学校の先生に聞かないんだい?
そういうのも含めて授業料払ってるんだから、もったいないよ。
847デフォルトの名無しさん:2007/07/22(日) 22:44:48
>>845
じゃあ自分でできるまでがんばれ
848デフォルトの名無しさん:2007/07/22(日) 22:48:27
'y'は文字リテラルで「y」に対応する数値(0x79)を表す
で、その行はこの値をline配列の0番目に代入するって意味

line[0]='y'; ←この部分の意味が知りたいです。って質問したら
上のように説明いただいたのですがまだ理解できないのでもう少し
お願いします。
849デフォルトの名無しさん:2007/07/22(日) 22:50:18
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int main()
{
int i, count;
double x, y, pi, z;
char line[20];
line[0]='y'; ←この部分の意味が知りたいです。
srand( (unsigned int) time(NULL) );
while(1){
count=0;  for (i = 1;i <= 10000000; i++) {
x = (double)rand() / (RAND_MAX + 1);
y = (double)rand() / (RAND_MAX + 1);
if(x*x + y*y < 1){ count++; }
pi=(double)count / i * 4 ;
z=fabs(M_PI - pi)/M_PI ;
if(i==100||i==1000||i==10000||i==100000||i==1000000||i==10000000){
printf("(%d)pi=%f(%f)\n",i,pi,z) ; }
} printf("もう一度やりますか(y/n)?");
gets(line);  if(line[0] == 'n'||line[0]=='N'){ break; }
} return 0; }
全体はこんな感じです。
850デフォルトの名無しさん:2007/07/22(日) 22:50:31
>>848
その説明のどのあたりが分からないかいってみそ。
851デフォルトの名無しさん:2007/07/22(日) 22:52:28
デフォで(何も入力しないで)Yesにするってことでは?
852デフォルトの名無しさん:2007/07/22(日) 22:53:16
>>849
その行、意味ないような気がするが。
853デフォルトの名無しさん:2007/07/22(日) 22:55:33
>>489
その行のプログラム中での存在意義が知りたいの?
854デフォルトの名無しさん:2007/07/22(日) 22:55:57
僕も意味がないように思って質問しました。
>>851さんの言ってることが正しいのでしょうか??
855デフォルトの名無しさん:2007/07/22(日) 22:57:43
>>853さん
そうです。なんの意味があるのかわからなくて…
あとおかしい部分ってありますか?
856デフォルトの名無しさん:2007/07/22(日) 22:58:02
>>854
if()でline[0]を見る前に、gets()を通してるから、初期化しても意味ないように見えるけど。
857デフォルトの名無しさん:2007/07/22(日) 22:58:06
>>846
明日、提出なんでs

>>847
時間が・・
858デフォルトの名無しさん:2007/07/22(日) 23:00:35
>>857
だーかーらー宿題は宿題スレで質問しろって
http://pc11.2ch.net/test/read.cgi/tech/1184506311/
859デフォルトの名無しさん:2007/07/22(日) 23:01:46
期限ギリギリまで自分で考えても分からなければ、「分かりませんでした」って言いに行けよ。
生徒の頭悪いのは教師がなんとかするしかないんだから、文句は言えんだろ。
860デフォルトの名無しさん:2007/07/22(日) 23:06:38
>>858
だーかーらー丸投げしたいわけじゃねーんだよ

>>859
そうすることにする
861デフォルトの名無しさん:2007/07/22(日) 23:08:35
死ねよ。
862デフォルトの名無しさん:2007/07/22(日) 23:10:08
大学はそんなに甘くない
頭も態度も悪けりゃ落とすだけ
863デフォルトの名無しさん:2007/07/22(日) 23:10:27
>>860
宿題を貼り付けて「教えてください」って、丸投げだろう。
自分はこういうふうに考えたとか、分からない箇所をもっと絞り込んで質問するとかしないと。
864デフォルトの名無しさん:2007/07/22(日) 23:10:28
明日提出で時間無いから自分で考えるのは無理だけど、
丸投げはしたくないから教えろってどんだけわがままなんだw
素直にあきらめるのが一番だな
865デフォルトの名無しさん:2007/07/22(日) 23:10:36
生徒はまったくついていけず
教師はますます授業の難易度を下げていく
日本学生の質の悪さは先進国でダントツトップとなる

こうして日本は平和になった
866デフォルトの名無しさん:2007/07/22(日) 23:11:56
>>859
教師も頭悪そうだから丁度いいかもね。
867デフォルトの名無しさん:2007/07/22(日) 23:12:48
>>865
>日本学生の質の悪さは先進国でダントツトップとなる
断然トップトップ?
868デフォルトの名無しさん:2007/07/22(日) 23:15:34
>>856さん
じゃあやっぱあの行はいらないですか??
869デフォルトの名無しさん:2007/07/22(日) 23:15:49
860は偽者じゃまいか
870デフォルトの名無しさん:2007/07/22(日) 23:16:00
断凸だと思ってたぜ
871デフォルトの名無しさん:2007/07/22(日) 23:18:16
>>868
不要
872デフォルトの名無しさん:2007/07/22(日) 23:26:19
大学は気持ち悪いくらいに甘々
技術者の端くれともいえないゴミが大学で教鞭振ってる現状は異常
教授なんてぶっちゃけ事務職(+他校とのパイプ役)以外のなんでもない
873デフォルトの名無しさん:2007/07/22(日) 23:28:28
int a[2]={10.20};printf("%d%d,a,&a[0]") 2つの数値表示させたとき、どうなる?一緒?
874デフォルトの名無しさん:2007/07/22(日) 23:30:46
でもあれだよな
y/nで聞かれているのにn以外だったら継続ってのもなんだよな
まぁ別にいいけどさ
875デフォルトの名無しさん:2007/07/22(日) 23:31:33
>>873
まず試してからこうなったんだけどって質問に来いよ
876デフォルトの名無しさん:2007/07/22(日) 23:33:07
0番目しか見てないからnipponchachachaでもループ抜ける
877デフォルトの名無しさん:2007/07/22(日) 23:37:25
>>873
つうかコンパイルとおらねぇだろ、それ。
なんかもういろいろ間違いすぎだ
878デフォルトの名無しさん:2007/07/22(日) 23:42:15
>>873
俺がコンパイラならキレる
879デフォルトの名無しさん:2007/07/22(日) 23:54:38
int a[2]={10,20};
printf("%d %d",a,&a[0]);
とりあえずコンパイル通るようにしてみた。
%dのままでいいかどうかはシラネ
880デフォルトの名無しさん:2007/07/22(日) 23:55:22
これは凄い間違い探しだ
881デフォルトの名無しさん:2007/07/23(月) 00:02:10
>>877-878
思わずワロタ

コンパイラ超がんばれ
882デフォルトの名無しさん:2007/07/23(月) 00:04:30
同じ値にしたいなら

("%d %d",a[0],a[0]);

でいいじゃないか
883デフォルトの名無しさん:2007/07/23(月) 00:36:11
イロイロすまんかった。解決した。

ありがとう^^ コンパイラに切れられないように精進します。
884デフォルトの名無しさん:2007/07/23(月) 02:04:06
文字列操作について質問させて下さい。
strcpyで、コピー元とコピー先が重なる場合の動作は、定義されない。
とあるんですが、これは
char str[] = "abcdef";
char *p1, *p2;
p1=str; p2=&str[1];
strcpy(p1, p2);
とした場合の動作も未定義となるのでしょうか?
885デフォルトの名無しさん:2007/07/23(月) 02:05:17
ダメです。
886デフォルトの名無しさん:2007/07/23(月) 02:43:32
>>884
おもいっきり重なってないか?
重なったら未定義らしいんですが、重なってたら未定義ですか?って質問してるぞ。
887884:2007/07/23(月) 03:33:59
>>885-886
回答ありがとうございました。
888デフォルトの名無しさん:2007/07/23(月) 03:42:31
>>884
この場合の「重なる場合」とは、どこか一部でも重なっている場合を指す。
889デフォルトの名無しさん:2007/07/23(月) 06:40:06
Windows PCの名前は何文字まで可能でしょうか?
890デフォルトの名無しさん:2007/07/23(月) 06:46:26
やればわかる
891デフォルトの名無しさん:2007/07/23(月) 14:00:31
C言語を少しだけ勉強したい。コンパイル用に安いVisual C++を入手
する方法を教えてください。バージョンは古くてもいいです。
892デフォルトの名無しさん:2007/07/23(月) 14:02:37
>>891
無料じゃだめか?
VisualC++2005ExpressEdition
MicrosoftのHPからダウンロードできる
http://www.microsoft.com/japan/msdn/vstudio/express/visualc/
893デフォルトの名無しさん:2007/07/23(月) 14:21:40
>>891 その前に、BCCとCpad for BCCにしとき。
894デフォルトの名無しさん:2007/07/23(月) 17:15:06
BCC なんて古くて死ぬぜ。
895デフォルトの名無しさん:2007/07/23(月) 17:16:24
VC++2005EEのCL.EXEがいいぞ
896デフォルトの名無しさん:2007/07/23(月) 17:17:02
まあ両方入れて同時に使ってみるべし
897デフォルトの名無しさん:2007/07/23(月) 17:17:49
今更 BCC とか
898えいいち ◆GRGSIBERIA :2007/07/23(月) 18:12:49
#include <iostream>
using namespace std;

int main(){
int a, b;
int *p;

p = &a;

*p = 0;
cout << a << "-" << *p << "\n";

p--;
*p = 1;
cout << b << "-" << *p << "\n";
//cout << &b << "-" << p << "???\n";
return 0;
}


名前の違う変数をいくつか宣言し、forとポインタを使っていっぺんに初期化をしたいのですが、
このまま実行すると、pが&bを指しているのにも関わらず、bの値が変になってしまいます。
ですが、コメントを外すと正常に表示されます。二つのアドレスも同じです。
どうしてそうなるのか、またどうすれば改善できるのか教えてください。お願いします。
899デフォルトの名無しさん:2007/07/23(月) 18:13:21
スレタイ嫁
900デフォルトの名無しさん:2007/07/23(月) 18:29:55
いや、これは出力がC++なだけで、Cの質問と思ってもいいのでは。
でも質問のソースは何か抜けてる。
もう一回書いてみて。printf()になおすのが望ましいが。
901デフォルトの名無しさん:2007/07/23(月) 18:34:53
よかないよ。
902デフォルトの名無しさん:2007/07/23(月) 18:35:32
vc2005ってNRVO効いたのか
903デフォルトの名無しさん:2007/07/23(月) 18:42:43
#include <stdio.h>

int main(void)
{
int a, b, *p;

p = &a;
*p = 0;

printf("%d , %d\n",a , *p);
*(--p) = 1;
printf("%d , %d\n",b , *p);
printf("%p , %p\n",&b , p);

return 0;
}
904デフォルトの名無しさん:2007/07/23(月) 18:46:57
>名前の違う変数をいくつか宣言し、forとポインタを使っていっぺんに初期化をしたいのですが
普通に宣言時に初期化したほうがいいんじゃね?
つうか配列とかC++ならvectorみたいなコンテナ使った方がいいんじゃね?
って突っ込みは野暮ですか?
905デフォルトの名無しさん:2007/07/23(月) 18:53:15
p--って連続したアドレスの同じ型じゃないとだめじゃん
だったら配列使えばいいじゃん
なんで違う値になるのか知らんが
906ゆみ:2007/07/23(月) 19:03:57
大学の演習問題として出題されました。三時間考えて悩みましたがわかりません。どうか御教授お願いします。

・char 型の配列aに"HellowWorld"の文字列を格納すること。
・配列aからchar 型の配列bにデータをコピーすること。
 ※標準関数(memcpy,strcpy等)を使用しないこと。
・配列bからchar 型の配列cにデータをコピーすること。
 ※但し、"w"、"W"は"*"にデータをすりかえてデータをコピーすること。
  →配列cには文字列"Hello**orld"を格納すること。
・printf()で表示する際は、配列cのデータを一文字づつ表示すること。
 ※"o"を表示する際は、"o"を表示する代わりに"O"を5つ表示すること。
・プロジェクト名は"ckadai3"とすること。
907ゆみ:2007/07/23(月) 19:13:20
906です。
ヒントで配列のコピーはFOR文で回してあげればいいんだよ
と教えてもらいましたがいまいちよくわかりません。
908デフォルトの名無しさん:2007/07/23(月) 19:15:46
>>906
3時間何の勉強してたんだ?
一問目は配列とfor文だけわかれば出来ると思うんだが
それ以降もif文使えばできる
909デフォルトの名無しさん:2007/07/23(月) 19:16:17
宿題スレでもいけ
910デフォルトの名無しさん:2007/07/23(月) 19:16:30
911デフォルトの名無しさん:2007/07/23(月) 19:16:35
つーか宿題スレ池
912デフォルトの名無しさん:2007/07/23(月) 19:24:54
#include <stdio.h>
#define STR_SIZE 64
void copy(char *a, char *b);
void copyNotW(char *a, char *b);
void PrintStrChngO(char *str);
int main(void)
{
char a[] = "HellowWorld", b[STR_SIZE], c[STR_SIZE];
copy(b, a);printf("%s\n", b);
copyNotW(c, b);PrintStrChngO(c);
return 0;
}
void PrintStrChngO(char *str)
{
for(;*str;str++)
if(*str != 'o') putchar(*str); else printf("OOOOO");
return;
}
void copyNotW(char *a, char *b)
{
while(*a = *b++)
*a++ = *a=='w'||*a=='W' ? '*' : *a;
return;
}
void copy(char *a, char *b)
{
while(*a++ = *b++);
return;
}
913デフォルトの名無しさん:2007/07/23(月) 19:39:41
894 名前:デフォルトの名無しさん 投稿日:2007/07/23(月) 17:15:06
BCC なんて古くて死ぬぜ。

897 名前:デフォルトの名無しさん 投稿日:2007/07/23(月) 17:17:49
今更 BCC とか
914デフォルトの名無しさん:2007/07/23(月) 19:41:25
BCC は switch 内に case も default もない場合にも
{ } 内の処理が実行されてしまう程度のコンパイラ。
915デフォルトの名無しさん:2007/07/23(月) 19:41:58
914 名前:デフォルトの名無しさん 投稿日:2007/07/23(月) 19:41:25
BCC は switch 内に case も default もない場合にも
{ } 内の処理が実行されてしまう程度のコンパイラ。
916デフォルトの名無しさん:2007/07/23(月) 19:45:45
#include <stdio.h>
int main(void) {
int n=1;
switch(n) {
printf("BCC は switch 内に case も default もない場合にも \n");
printf("{ } 内の処理が実行されてしまう程度のコンパイラ。 \n");
}
return 0;
}

Warning W8066 Unreachable code in function main
警告も理解できない奴が何ほざいてやがるんだ?w
初心者がMT車はギアチェンジが面倒だから古いとか言っちゃっているくらい痛すぎ
917えいいち ◆GRGSIBERIA :2007/07/23(月) 19:47:07
すみません。C言語に直しました。

#include <stdio.h>

int main(){
int a, b;
int *p;

p = &a;

*p = 0;
printf("%d - %d\n", a, *p);

p--;
*p = 1;
printf("%d - %d\n", b, *p);
//printf("%X - %X\n", &b, p);
return 0;
}
918デフォルトの名無しさん:2007/07/23(月) 19:51:05
>>917
p--;って何がしたいんだ。
919デフォルトの名無しさん:2007/07/23(月) 20:00:07
for文の初期化はどこにあるんだ
920デフォルトの名無しさん:2007/07/23(月) 20:08:30
>916
Unreachable code in function mainの意味は「main関数に到達不能なコードがあります」だ(return文の後に書いたコードにも同じ警告が出るはず)。
しかし実際には警告と異なり、>>914が書いたように実行されてしまう。
921デフォルトの名無しさん:2007/07/23(月) 20:20:57
初心者にVC++2005EEなんて進めても、今度は使い方を教えてくれってなるだろw
922デフォルトの名無しさん:2007/07/23(月) 20:20:59
文字コードについて、わかりやすく解説してあるサイトはないでしょうか?
ASCCIコードやJISなど、何進数を使って、どういう特徴があるかなど
923デフォルトの名無しさん:2007/07/23(月) 20:34:22
ASCCIコード に一致する日本語のページ 約 73 件中 1 - 50 件目 (0.20 秒)
924デフォルトの名無しさん:2007/07/23(月) 20:36:23
>何進数を使って
925デフォルトの名無しさん:2007/07/23(月) 21:01:43
>何進数を使って
ワロタww
16進数でも10進数でも2進数でも値は同じだよ
926デフォルトの名無しさん:2007/07/23(月) 21:07:43
927デフォルトの名無しさん:2007/07/23(月) 21:11:33
>>922
文字コードについて、とりあえず知ってる語彙でググる。
上位にでてくるページをみて、語彙を増やす。

これを30分程度繰り返すだけで、そうとうのページを探せると思うけど。
928ゆみ:2007/07/23(月) 21:28:24
>912
ありがとうございます。
助かりました。
929えいいち ◆GRGSIBERIA :2007/07/23(月) 21:43:42
>>918
#include <iostream>
using namespace std;

int main(){
int a, b;
int c, d;
int *p;

p = &a;

*p = 0;
cout << a << "-" << *p << "\n";
//cout << &a << "-" << p << "\n";

p--;
*p = 1;
cout << b << "-" << *p << "\n";
//cout << &b << "-" << p << "\n";
930えいいち ◆GRGSIBERIA :2007/07/23(月) 21:44:13
p--;
*p = 2;
cout << c << "-" << *p << "\n";
//cout << &c << "-" << p << "\n";

p--;
*p = 3;
cout << d << "-" << *p << "\n";
//cout << &d << "-" << p << "\n";

return 0;
}

別にdからでも動くと思います。
931922:2007/07/23(月) 22:04:03
サンクス
932デフォルトの名無しさん:2007/07/23(月) 22:04:50
-10の2進数は 11110110であってますでしょうか?
933デフォルトの名無しさん:2007/07/23(月) 22:07:24
>>932
合ってる。
基数の変換はWindowsの電卓でできるよ。
934923:2007/07/23(月) 22:11:22
はい、ありがとうございました。
935デフォルトの名無しさん:2007/07/23(月) 22:17:59
>>930
動くかも知れんがあまりそういうことはやらないんじゃない?
ローカル変数をスタックに積む順番ってC言語の仕様で決められてたっけ?
936デフォルトの名無しさん:2007/07/23(月) 22:31:23
10 は 0000 1010
反転して 1111 0101
1足して 1111 0110
2の補数表現には反転して1足すのが楽
937デフォルトの名無しさん:2007/07/24(火) 00:12:39
>>930
だから、なんでスレタイ無視してC++で書くの?

>>935
決まっていない。そもそも、スタックフレームを形成するかどうかさえ決まっていない。
つーか、まともなコンパイラなら、ちゃんと最適化すればアドレス解決演算子を使っている
a以外はスタックに置かない。それどころか存在そのものを否定するかもしれん。
938デフォルトの名無しさん:2007/07/24(火) 01:19:40
>>936
別のやり方ですね
939デフォルトの名無しさん:2007/07/24(火) 01:22:05
普通のやり方かと・・・
940デフォルトの名無しさん:2007/07/24(火) 01:29:23
別のやり方とは?
941デフォルトの名無しさん:2007/07/24(火) 01:34:12
1を引いて反転するとかを言いたいんじゃない?
いや、一緒なんだけどさ・・・足すほうが俺は計算しやすいな。
942デフォルトの名無しさん:2007/07/24(火) 01:46:38
Cで書いたアプリケーション中で、./image/image1.bmpってファイル参照を書いてます。
これをコンパイルして、そのディレクトリで実行したら画像は表示されるのに、
別のディレクトリから、../../app みたいに実行すると画像が表示されません。
どうやったらどこから実行しても画像が表示できるようになりますか?
943デフォルトの名無しさん:2007/07/24(火) 01:55:51
符号反転に-1を使うのは、なにか自分の定義に自分自身を使うようで、なんかイヤ。
944デフォルトの名無しさん:2007/07/24(火) 02:17:32
>>942
画像ファイルの指定を絶対パスにてみては?
945デフォルトの名無しさん:2007/07/24(火) 02:20:24
>>943
・・・??
946デフォルトの名無しさん:2007/07/24(火) 03:14:43
>>942
>>944 の言うように絶対パスにするとか
readlink("/proc/self/exe"); とか getenv("_") とかソースに埋め込むとか
いろいろあるだろうけど基本的にはC言語の範疇じゃないな.
947デフォルトの名無しさん:2007/07/24(火) 03:36:21
>>942
これで助けになるかな?
#include<stdio.h>
#include<libgen.h>

int main(int argc, char *argv[]){
printf("%s/image/image1.bmp\n", dirname(argv[0]));
return 0;
}
948デフォルトの名無しさん:2007/07/24(火) 03:48:29
>>942
これなら Windows でも Unix 系OSでもいける(日本語はNGだが)
#include<stdio.h>
#include<string.h>

int main(int argc, char *argv[]){
char *ptr;
ptr=strrchr(argv[0], '/');
if(ptr==NULL) ptr=strrchr(argv[0], '\\');
if(ptr!=NULL) printf("%.*s/image/image1.bmp\n", ptr-argv[0], argv[0]);
else printf("./image/image1.bmp\n");
return 0;
}
949デフォルトの名無しさん:2007/07/24(火) 10:12:47
#include <stdio.h>

int count_bits(unsigned x)
{
int count = 0;
while (x) {
if (x & 1U) count++;
x >>= 1;
}
return (count);
}

int int_bits(void)
{
return (count_bits(~0U));
}

unsigned print_bits(unsigned x,unsigned y)
{
int i,n=0;
int temp;
unsigned sum = 0;

for (i = int_bits() - 1;i>=0;i--) {
if ((y>>i) & 1U)
temp = 1;
else
temp = 0;
950デフォルトの名無しさん:2007/07/24(火) 10:16:46
for (i = int_bits() -n -1;i>=0;i--)
temp *= 2;
n++;
sum += x * temp;
}
return (sum);
}

int main(void)
{
unsigned x,y;

printf("正の整数を入力してください:");
scanf("%u",&x);
printf("正の整数を入力してください:");
scanf("%u",&y);

printf("\n%3u×%3u=%3u\n",x,y,print_bits(x,y));

return(0);
}

123 x 13 = 123 x 2^3 + 123 x 2^2 + 123 x 2^0 みたいに計算したいのですが、結果が0と表示されます。
なぜでしょうか?
951デフォルトの名無しさん:2007/07/24(火) 10:26:20


   ま た s c a n f か

952デフォルトの名無しさん:2007/07/24(火) 10:29:47
両方のforのループカウンタでiを使ってるけどこれは意図してこう書いてるの?
953デフォルトの名無しさん:2007/07/24(火) 10:48:43
Visual C++を入手するには
Visual Studioを購入しなければならないのですか?
954デフォルトの名無しさん:2007/07/24(火) 10:51:30
コマンドライン版だけ欲しいってことならPlatformSDKでも落としとけ
955デフォルトの名無しさん:2007/07/24(火) 10:52:58
>>953
VisualC++2005ExpressEditionは無料でダウンロードできるよ
956デフォルトの名無しさん:2007/07/24(火) 10:53:22
>950
>for (i = int_bits() -n -1;i>=0;i--)
>temp *= 2;
>n++;
iじゃなくて別の変数にすべきだし>=じゃなくて>だろってのはおいといても、temp << i で十分だろ
957デフォルトの名無しさん:2007/07/24(火) 10:53:32
そのメール欄からして>>891

答え書いてあるのに読めないのか?
別人だとしてこのスレぐらい全部読めよ
っていうか入門書だとかに大抵無料のコンパイラついてくるんだからそれ使えよ
958デフォルトの名無しさん:2007/07/24(火) 11:19:11
>892 大変失礼しました。わたしの質問891が1時間ほど待っても表示され
なかったのでgive upしてしまったのです。よく分かりました。
ありがとうございました。
959デフォルトの名無しさん:2007/07/24(火) 16:38:46
>>956
unsigned print_bits(unsigned x,unsigned y)
{
int i;
int temp;
unsigned sum = 0;

for (i = int_bits() - 1;i>=0;i--) {
if ((y>>i) & 1U)
temp = 1;
else
temp = 0;

temp << i

sum += x * temp;
}
return (sum);
}

変更したのですが、コンパイルすると、コードは効果を持たない(関数 print_bits )とでてしまいました。
どうしてでしょうか?
960デフォルトの名無しさん:2007/07/24(火) 16:46:03
int_bits()がどこから出てきたのか我々には分かりません。
961デフォルトの名無しさん:2007/07/24(火) 16:50:05
>>960
>>949にあるんだけどね。
流れを追えないだけじゃなく、見当違いだから黙ってていいよ。

>>959
sum += x * (temp << i)でいいということだろ。
962デフォルトの名無しさん:2007/07/24(火) 17:00:22
>>961
temp << i
sum += x * temp;

でも問題ないだろ
セミコロンが無いのはともかく
963デフォルトの名無しさん:2007/07/24(火) 17:06:01
いやそれは問題あるだろ
temp <<= i; としたいのか?
964デフォルトの名無しさん:2007/07/24(火) 17:09:48
なんだってこのスレはこんなに頭の弱い子ばかりなんだろう……
965デフォルトの名無しさん:2007/07/24(火) 17:11:45
入門篇だからだよ
966デフォルトの名無しさん:2007/07/24(火) 17:12:54
すいません、わかりました。

temp = temp<<i;

でいけました。ご迷惑おかけしました
967デフォルトの名無しさん:2007/07/24(火) 17:27:22
何だこのバカさ加減は。
968デフォルトの名無しさん:2007/07/24(火) 17:33:01
その他人を見下す性格、あらためた方がいいと思うよ
969デフォルトの名無しさん:2007/07/24(火) 17:54:09
何百回も繰り返しcallされる関数が有るのですが、最初にcallされ
た場合に限り、特別な処理がしたいと思っています。staticなフラ
グを宣言すれば出来るには出来るのですが、何百回もcallされるの
に、最初の一回の為にフラグをチェックするのはちょっとバカバカ
しい。何か良い方法は無いでしょうか?
970デフォルトの名無しさん:2007/07/24(火) 17:56:01
>>969
間接コール?
971デフォルトの名無しさん:2007/07/24(火) 17:59:00
>>969
「最初にcallされた場合」フラグを関数内に持たず、関数外から引き数で与えては?
高々数百回程度じゃ歯糞にもならないけどね。
972デフォルトの名無しさん:2007/07/24(火) 18:04:34
関数ポインタで

func = first_func;
...
func = second_func;
とかやればいいんだけど普通の関数コールに比べてオーバーヘッドが発生するんで
フラグのチェックよりマシとは言いがたい。
973デフォルトの名無しさん:2007/07/24(火) 18:11:30
>最初の一回の為にフラグをチェックする
のではなく、
2回目以降全ての為に(1回目も)フラグをチェックする
と考えてはどうだろう。

いや、どうでもいいけどね。
974デフォルトの名無しさん:2007/07/24(火) 18:12:42
>>972
オーバーヘッドについて詳しく。
私の知る限り、イミディエイト関数呼び出しとレジスタ間接関数呼び出しで
大きく処理時間が異なるCPUはないのだけれど。
#寧ろ、某CPUはレジスタ間接の方が速いし。
975デフォルトの名無しさん:2007/07/24(火) 18:19:44
>>974
昔のパソコンは結構効いてたけど、最近のはあんまり関係ない気がする。
976デフォルトの名無しさん:2007/07/24(火) 18:23:11
レジスタに関数のアドレスをセットするのがオーバーヘッドになるって事でしょ
977デフォルトの名無しさん:2007/07/24(火) 18:32:38
>>976
それもまた、今のCPUなら殆ど無視できる。
978デフォルトの名無しさん:2007/07/24(火) 18:38:05
計測は力なり
979デフォルトの名無しさん:2007/07/24(火) 18:40:33
Efficeon搭載機を使う、とか…
980デフォルトの名無しさん:2007/07/24(火) 18:42:15
多少汚くても高速なCPUが力押しで処理してくれるのはいいんだが
初心者の小規模なプログラムだと「こっちのほうが高速だぜ」って言われても実感できない…
981デフォルトの名無しさん:2007/07/24(火) 18:53:48
知らぬ間にメモリ参照のコスト0の新技術が開発されたのかと思ったぜ
982デフォルトの名無しさん:2007/07/24(火) 18:56:23
関数呼び出しそのもののオーバーヘッドに対して、充分無視できるって話なだ。
983デフォルトの名無しさん:2007/07/24(火) 19:08:34
いや、static なフラグのチェック処理と比べるべきじゃないか。

このフラグのチェックも、
キャッシュと分岐予測が効けば大したことなさそうではある。
まあ、コスト 0 ではないだろうが。
984デフォルトの名無しさん:2007/07/24(火) 19:23:13
だからそもそも、高々数百回ごときで時間云々する意味がないっしょ。
staticにする場合はマルチスレッドの場合に問題がないか確認する必要はあるね。
985デフォルトの名無しさん:2007/07/24(火) 19:30:58
This is a pen.
を取得するプログラムを書きたいのです。



char str[1024];

while(1){
scanf("%s", str)
func(str);//funcと言う関数に"This is a pen."を一度に入れたい。
}

こういったプログラムを書いてThis is a pen.と入力すると、何故か
1周目のループで、Thisが入り、2週目でis・・・5週目で.が入ってしまいます。
こういう問題はどのようにすれば解決するのでしょうか?
986デフォルトの名無しさん:2007/07/24(火) 19:34:36
987デフォルトの名無しさん:2007/07/24(火) 19:50:55
>>985
scanf("%1023[^\n]", str)
素直にfgets(str, sizeof(str), stdin)を使うべきだとは思うが。
988デフォルトの名無しさん:2007/07/24(火) 19:52:15
>>985
scanfは空白で入力が区切られるようになっている。
989デフォルトの名無しさん:2007/07/24(火) 22:39:57
1Gは1000.000バイトらしいのですが、どうやって求めるのでしょうか?
どうやれば、ギガをバイトにするのでしょか?
990デフォルトの名無しさん:2007/07/24(火) 22:42:56
これはひどい
991デフォルトの名無しさん:2007/07/24(火) 22:43:46
>>989
単位なんだから、もとめるもなにもないだろう。
K -> M -> G で、1000倍していけばいいよ。
992デフォルトの名無しさん:2007/07/24(火) 22:45:12
>>989
どこからの情報ですか?
993デフォルトの名無しさん:2007/07/24(火) 22:48:24
1024
994デフォルトの名無しさん:2007/07/24(火) 22:49:35
>>992
HDDメーカじゃないかな
あの業界だけ1000単位
995デフォルトの名無しさん:2007/07/24(火) 22:50:40
テラワロスとかって書き込みみても、どのくらいワロスのかピンとこないかわいそうな子。
996デフォルトの名無しさん:2007/07/24(火) 22:51:14
Kなら1024だけどkなら1000
容量なら1024だけどスループットなら1000
997デフォルトの名無しさん:2007/07/24(火) 22:57:41
サンクスです

>>992
解説の例題問題にありました。
998989:2007/07/24(火) 23:04:10
>>991
となると、1000.000.000 ではないのでしょうか?
999デフォルトの名無しさん:2007/07/24(火) 23:06:47
>>998
だね。
1000000だと1M。
1000デフォルトの名無しさん:2007/07/24(火) 23:09:42
1000なら1K
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。