801 :
デフォルトの名無しさん:
乱数のプログラムですが、
time関数を使うために
srand((unsigned int)time(NULL));
を使うとコンパイル時に 未定義のシンボルNULLとエラーがでてしまいます。
どうすればよいでしょうか。
>>801 使用している環境は?stdio.h やら stdlib.h あるいは iostream など取り込んでいるか?
#インクルード タイム。h
って書いた?
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個発生させるというものです。
それで NULL が使えないのか・・・。
なら stddef.h でもインクルードしとけ。
どこの処理系だよ。
809 :
デフォルトの名無しさん:2007/07/22(日) 17:12:33
<stddef.h > インクルードしましたがやはりエラーは消えませんでした。
808様 0に変えることでコンパイル成功しました。ありがとうございます。
0 にすれば問題はないけど、
NULL が使えないというその処理系は凄く気持ち悪いな。
他にも変な所がありそうで怖い。
そのプロジェクトはいったん忘れて
nulltest.cってファイル作って下のソース書いて実行してみたら。
これで通らなかったから根本的なところでなんかおかしい。
#include <stdio.h>
int main(){ return (int)NULL; }
安易な解決法を提示したがために、
後々困ることにならない事を祈る。
814 :
デフォルトの名無しさん:2007/07/22(日) 17:21:50
Cコンパイラ:Borland C++ Compilerを使っています。
812様のソース実行しましたが、やはりエラーがでてしまいました
バージョンが古すぎるんじゃね?
#define NULL 0でも書いて対応するしかなさそ。
816 :
デフォルトの名無しさん:2007/07/22(日) 17:30:19
確かに古いのかもしれません。
#define NULL 0 と書いたら NULLが使えるようになりました!
色々とご指摘ありがとうございます
いくらバージョンが古くても、NULL がないってことあるのかなあ。
インストール手順で何かミスがあったとしか・・・。
NULL が使えないってことは、size_t とかも使えないんだろうか。
#include <stddef.h>
int main() { return (int)(size_t)0; }
は通る?
818 :
デフォルトの名無しさん:2007/07/22(日) 17:34:52
817様のソースは 通りました
インストール手順は、他のでは上手くいくのでミスはないかと・・・
size_t は使えるのか・・・。
NULL だけ使えないって何か不思議だなあ。
まあ、NULL だけ使えないみたいだから、
自前で定義するか 0 を直接使うかってところか・・・。
stddef.h を探して NULL の定義を直接埋め込んだのでもいいとは思う。
そのウンココパイラ捨てろw
ヘッダファイル内で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");
}
}
さっぱりわかりません
よろしくお願いします
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]);
}
}
これもさっぱりです・・・
教えてください
さっぱりって言われると何教えていいか分かんないよ
先生にでも聞いたら?
簡易CG作成のプログラムなんですけど、
円を作ってそれを移動、壁で反射、色が点滅などやらなければいけなくて
移動までは出来るようになったんですが後がさっぱりでs
助けてくだしあ><
>825
宿題の答えが知りたいだけなら、宿題スレ行けよ
私も冷たいシャワーを浴びてさっぱりです
ファイルのオープンに関して質問させてください
文字列を名前にした場合
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とかしてみましたが上手くいきません
結構悩んだのですがさっぱりです!!
解説よろしくお願いします
sprintf使え
>>831 char buf[100];
int i;
for(i=0;i<=2;i++) {
sprintf(buf,"&d.txt",i);
fp = fopen(buf,"r");
//
}
834 :
833:2007/07/22(日) 20:23:46
失敗
×sprintf(buf,"&d.txt",i);
○sprintf(buf,"%d.txt",i);
bccだが
>>812問題なかったぞ
バージョンは5.5.1
全くの初心者です。
います。C言語の基礎の基礎という本に添付されたCDに入っていたLSI Cを使ってプログラム
のコンパイルをしようとしています。書かれていたプログラムをSample1.c
という名前で保存しました。コマンドプロンプト画面で
C:\CGENGO\PRACTICE>DIRを入力して調べると469 Sample1.cが保存されて
いるのが分かります。
同じ画面でC:\CGENGO\PRACTICE>Lcc Sample1と入力しても
SAMPLE.EXEが作成されません。どうしたらよいか教えてください。
C言語どころかパソコン初心者…?
まずその本に書かれている通り導入したのか?
Windows 環境変数 PATH
でぐぐる
>>837 マジで悪いことは言わないからLSI-Cはやめてbccかgcc(MinGW)にしとけ。
乗りかえるの今からでも全く遅くないから。
>>837 VisualC++2005ExpressEditionでもいいぞ
VisualC++2005ExpressEditionは初心者が
C学ぶのに使うと、ANSI Cの標準関数で
非推奨な関数(scanfとか)使うとwarrningでまくりで
混乱するんじゃないか?
コピペしてそのままデバッグすると、モノによるが一瞬で消えるしな
皆さんありがとう。参考にさせていただきます。(初心者)
>>829 すいません、教えて欲しいんです。
自分でできるようになりたいです。
どうして学校の先生に聞かないんだい?
そういうのも含めて授業料払ってるんだから、もったいないよ。
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; }
全体はこんな感じです。
>>848 その説明のどのあたりが分からないかいってみそ。
デフォで(何も入力しないで)Yesにするってことでは?
>>489 その行のプログラム中での存在意義が知りたいの?
854 :
デフォルトの名無しさん:2007/07/22(日) 22:55:57
僕も意味がないように思って質問しました。
>>851さんの言ってることが正しいのでしょうか??
855 :
デフォルトの名無しさん:2007/07/22(日) 22:57:43
>>853さん
そうです。なんの意味があるのかわからなくて…
あとおかしい部分ってありますか?
>>854 if()でline[0]を見る前に、gets()を通してるから、初期化しても意味ないように見えるけど。
期限ギリギリまで自分で考えても分からなければ、「分かりませんでした」って言いに行けよ。
生徒の頭悪いのは教師がなんとかするしかないんだから、文句は言えんだろ。
死ねよ。
大学はそんなに甘くない
頭も態度も悪けりゃ落とすだけ
>>860 宿題を貼り付けて「教えてください」って、丸投げだろう。
自分はこういうふうに考えたとか、分からない箇所をもっと絞り込んで質問するとかしないと。
明日提出で時間無いから自分で考えるのは無理だけど、
丸投げはしたくないから教えろってどんだけわがままなんだw
素直にあきらめるのが一番だな
生徒はまったくついていけず
教師はますます授業の難易度を下げていく
日本学生の質の悪さは先進国でダントツトップとなる
こうして日本は平和になった
>>865 >日本学生の質の悪さは先進国でダントツトップとなる
断然トップトップ?
868 :
デフォルトの名無しさん:2007/07/22(日) 23:15:34
>>856さん
じゃあやっぱあの行はいらないですか??
860は偽者じゃまいか
断凸だと思ってたぜ
大学は気持ち悪いくらいに甘々
技術者の端くれともいえないゴミが大学で教鞭振ってる現状は異常
教授なんてぶっちゃけ事務職(+他校とのパイプ役)以外のなんでもない
int a[2]={10.20};printf("%d%d,a,&a[0]") 2つの数値表示させたとき、どうなる?一緒?
でもあれだよな
y/nで聞かれているのにn以外だったら継続ってのもなんだよな
まぁ別にいいけどさ
>>873 まず試してからこうなったんだけどって質問に来いよ
0番目しか見てないからnipponchachachaでもループ抜ける
>>873 つうかコンパイルとおらねぇだろ、それ。
なんかもういろいろ間違いすぎだ
int a[2]={10,20};
printf("%d %d",a,&a[0]);
とりあえずコンパイル通るようにしてみた。
%dのままでいいかどうかはシラネ
これは凄い間違い探しだ
同じ値にしたいなら
("%d %d",a[0],a[0]);
でいいじゃないか
イロイロすまんかった。解決した。
ありがとう^^ コンパイラに切れられないように精進します。
文字列操作について質問させて下さい。
strcpyで、コピー元とコピー先が重なる場合の動作は、定義されない。
とあるんですが、これは
char str[] = "abcdef";
char *p1, *p2;
p1=str; p2=&str[1];
strcpy(p1, p2);
とした場合の動作も未定義となるのでしょうか?
ダメです。
>>884 おもいっきり重なってないか?
重なったら未定義らしいんですが、重なってたら未定義ですか?って質問してるぞ。
887 :
884:2007/07/23(月) 03:33:59
>>884 この場合の「重なる場合」とは、どこか一部でも重なっている場合を指す。
889 :
デフォルトの名無しさん:2007/07/23(月) 06:40:06
Windows PCの名前は何文字まで可能でしょうか?
やればわかる
C言語を少しだけ勉強したい。コンパイル用に安いVisual C++を入手
する方法を教えてください。バージョンは古くてもいいです。
>>891 その前に、BCCとCpad for BCCにしとき。
BCC なんて古くて死ぬぜ。
VC++2005EEのCL.EXEがいいぞ
まあ両方入れて同時に使ってみるべし
今更 BCC とか
#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の値が変になってしまいます。
ですが、コメントを外すと正常に表示されます。二つのアドレスも同じです。
どうしてそうなるのか、またどうすれば改善できるのか教えてください。お願いします。
スレタイ嫁
いや、これは出力がC++なだけで、Cの質問と思ってもいいのでは。
でも質問のソースは何か抜けてる。
もう一回書いてみて。printf()になおすのが望ましいが。
よかないよ。
vc2005ってNRVO効いたのか
#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;
}
>名前の違う変数をいくつか宣言し、forとポインタを使っていっぺんに初期化をしたいのですが
普通に宣言時に初期化したほうがいいんじゃね?
つうか配列とかC++ならvectorみたいなコンテナ使った方がいいんじゃね?
って突っ込みは野暮ですか?
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文で回してあげればいいんだよ
と教えてもらいましたがいまいちよくわかりません。
>>906 3時間何の勉強してたんだ?
一問目は配列とfor文だけわかれば出来ると思うんだが
それ以降もif文使えばできる
宿題スレでもいけ
つーか宿題スレ池
#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 とか
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;
}
for文の初期化はどこにあるんだ
>916
Unreachable code in function mainの意味は「main関数に到達不能なコードがあります」だ(return文の後に書いたコードにも同じ警告が出るはず)。
しかし実際には警告と異なり、
>>914が書いたように実行されてしまう。
初心者にVC++2005EEなんて進めても、今度は使い方を教えてくれってなるだろw
922 :
デフォルトの名無しさん:2007/07/23(月) 20:20:59
文字コードについて、わかりやすく解説してあるサイトはないでしょうか?
ASCCIコードやJISなど、何進数を使って、どういう特徴があるかなど
ASCCIコード に一致する日本語のページ 約 73 件中 1 - 50 件目 (0.20 秒)
>何進数を使って
?
>何進数を使って
ワロタww
16進数でも10進数でも2進数でも値は同じだよ
>>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からでも動くと思います。
931 :
922:2007/07/23(月) 22:04:03
サンクス
932 :
デフォルトの名無しさん:2007/07/23(月) 22:04:50
-10の2進数は 11110110であってますでしょうか?
>>932 合ってる。
基数の変換はWindowsの電卓でできるよ。
934 :
923:2007/07/23(月) 22:11:22
はい、ありがとうございました。
>>930 動くかも知れんがあまりそういうことはやらないんじゃない?
ローカル変数をスタックに積む順番ってC言語の仕様で決められてたっけ?
10 は 0000 1010
反転して 1111 0101
1足して 1111 0110
2の補数表現には反転して1足すのが楽
>>930 だから、なんでスレタイ無視してC++で書くの?
>>935 決まっていない。そもそも、スタックフレームを形成するかどうかさえ決まっていない。
つーか、まともなコンパイラなら、ちゃんと最適化すればアドレス解決演算子を使っている
a以外はスタックに置かない。それどころか存在そのものを否定するかもしれん。
938 :
デフォルトの名無しさん:2007/07/24(火) 01:19:40
普通のやり方かと・・・
別のやり方とは?
1を引いて反転するとかを言いたいんじゃない?
いや、一緒なんだけどさ・・・足すほうが俺は計算しやすいな。
Cで書いたアプリケーション中で、./image/image1.bmpってファイル参照を書いてます。
これをコンパイルして、そのディレクトリで実行したら画像は表示されるのに、
別のディレクトリから、../../app みたいに実行すると画像が表示されません。
どうやったらどこから実行しても画像が表示できるようになりますか?
符号反転に-1を使うのは、なにか自分の定義に自分自身を使うようで、なんかイヤ。
>>942 画像ファイルの指定を絶対パスにてみては?
>>942 >>944 の言うように絶対パスにするとか
readlink("/proc/self/exe"); とか getenv("_") とかソースに埋め込むとか
いろいろあるだろうけど基本的にはC言語の範疇じゃないな.
>>942 これで助けになるかな?
#include<stdio.h>
#include<libgen.h>
int main(int argc, char *argv[]){
printf("%s/image/image1.bmp\n", dirname(argv[0]));
return 0;
}
>>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;
}
#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;
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と表示されます。
なぜでしょうか?
ま た s c a n f か
両方のforのループカウンタでiを使ってるけどこれは意図してこう書いてるの?
Visual C++を入手するには
Visual Studioを購入しなければならないのですか?
コマンドライン版だけ欲しいってことならPlatformSDKでも落としとけ
>>953 VisualC++2005ExpressEditionは無料でダウンロードできるよ
>950
>for (i = int_bits() -n -1;i>=0;i--)
>temp *= 2;
>n++;
iじゃなくて別の変数にすべきだし>=じゃなくて>だろってのはおいといても、temp << i で十分だろ
そのメール欄からして
>>891か
答え書いてあるのに読めないのか?
別人だとしてこのスレぐらい全部読めよ
っていうか入門書だとかに大抵無料のコンパイラついてくるんだからそれ使えよ
>892 大変失礼しました。わたしの質問891が1時間ほど待っても表示され
なかったのでgive upしてしまったのです。よく分かりました。
ありがとうございました。
>>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 )とでてしまいました。
どうしてでしょうか?
int_bits()がどこから出てきたのか我々には分かりません。
>>960 >>949にあるんだけどね。
流れを追えないだけじゃなく、見当違いだから黙ってていいよ。
>>959 sum += x * (temp << i)でいいということだろ。
>>961 temp << i
sum += x * temp;
でも問題ないだろ
セミコロンが無いのはともかく
いやそれは問題あるだろ
temp <<= i; としたいのか?
なんだってこのスレはこんなに頭の弱い子ばかりなんだろう……
入門篇だからだよ
すいません、わかりました。
temp = temp<<i;
でいけました。ご迷惑おかけしました
何だこのバカさ加減は。
その他人を見下す性格、あらためた方がいいと思うよ
何百回も繰り返しcallされる関数が有るのですが、最初にcallされ
た場合に限り、特別な処理がしたいと思っています。staticなフラ
グを宣言すれば出来るには出来るのですが、何百回もcallされるの
に、最初の一回の為にフラグをチェックするのはちょっとバカバカ
しい。何か良い方法は無いでしょうか?
>>969 「最初にcallされた場合」フラグを関数内に持たず、関数外から引き数で与えては?
高々数百回程度じゃ歯糞にもならないけどね。
関数ポインタで
func = first_func;
...
func = second_func;
とかやればいいんだけど普通の関数コールに比べてオーバーヘッドが発生するんで
フラグのチェックよりマシとは言いがたい。
>最初の一回の為にフラグをチェックする
のではなく、
2回目以降全ての為に(1回目も)フラグをチェックする
と考えてはどうだろう。
いや、どうでもいいけどね。
>>972 オーバーヘッドについて詳しく。
私の知る限り、イミディエイト関数呼び出しとレジスタ間接関数呼び出しで
大きく処理時間が異なるCPUはないのだけれど。
#寧ろ、某CPUはレジスタ間接の方が速いし。
>>974 昔のパソコンは結構効いてたけど、最近のはあんまり関係ない気がする。
レジスタに関数のアドレスをセットするのがオーバーヘッドになるって事でしょ
>>976 それもまた、今のCPUなら殆ど無視できる。
計測は力なり
Efficeon搭載機を使う、とか…
多少汚くても高速なCPUが力押しで処理してくれるのはいいんだが
初心者の小規模なプログラムだと「こっちのほうが高速だぜ」って言われても実感できない…
知らぬ間にメモリ参照のコスト0の新技術が開発されたのかと思ったぜ
関数呼び出しそのもののオーバーヘッドに対して、充分無視できるって話なだ。
いや、static なフラグのチェック処理と比べるべきじゃないか。
このフラグのチェックも、
キャッシュと分岐予測が効けば大したことなさそうではある。
まあ、コスト 0 ではないだろうが。
だからそもそも、高々数百回ごときで時間云々する意味がないっしょ。
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週目で.が入ってしまいます。
こういう問題はどのようにすれば解決するのでしょうか?
>>985 scanf("%1023[^\n]", str)
素直にfgets(str, sizeof(str), stdin)を使うべきだとは思うが。
>>985 scanfは空白で入力が区切られるようになっている。
989 :
デフォルトの名無しさん:2007/07/24(火) 22:39:57
1Gは1000.000バイトらしいのですが、どうやって求めるのでしょうか?
どうやれば、ギガをバイトにするのでしょか?
これはひどい
>>989 単位なんだから、もとめるもなにもないだろう。
K -> M -> G で、1000倍していけばいいよ。
1024
>>992 HDDメーカじゃないかな
あの業界だけ1000単位
テラワロスとかって書き込みみても、どのくらいワロスのかピンとこないかわいそうな子。
Kなら1024だけどkなら1000
容量なら1024だけどスループットなら1000
997 :
デフォルトの名無しさん:2007/07/24(火) 22:57:41
サンクスです
>>992 解説の例題問題にありました。
998 :
989:2007/07/24(火) 23:04:10
>>991 となると、1000.000.000 ではないのでしょうか?
1000 :
デフォルトの名無しさん:2007/07/24(火) 23:09:42
1000なら1K
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。