1 :
デフォルトの名無しさん :
2012/05/04(金) 04:05:26.52
すみません。教えてください。 mikrocというコンパイラを使ってPICマイコンで電子工作をしてるのですが、 指定した桁の値を取り出すにはどうすれば良いのでしょうか? 例)x = 12345;という変数の中の値を、a = 1;b = 2;c = 3;d = 4;e = 5; というように取り出したいです。 C言語についてはPICで遊ぶために0からのスタートでして、ほぼ初心者です。 よろしくお願いします。
>>2 取り出したい桁を右からn桁目とすると
「(n-1)回、10で割った整数」を10で割った際の余りを求めれば良い
>>2 >>3 のやり方が正攻法だと思う。
バッファを余計に使って良ければ、sprintfを使うのが簡単かな。
char buf[10];
int x = 12345;
sprintf(buf, "%d", x);
これで、buf[0]: 1, buf[1]: 2, buf[2]: 3, buf[3]: 4, buf[4]: 5
となります。
5 :
デフォルトの名無しさん :2012/05/04(金) 11:47:36.94
ビットフィールドへのポインタを関数に渡したいです。 しかしポインタのアドレスはバイト単位であり、 無理だということが分かったのですが何か良い方法は無いでしょうか? なぜこんな事がしたいかと言いますと、とびとびの複数のビットフィールドに対し 同じ処理を行いたく冒頭の事が出来ないか試行錯誤していました。 ご助言頂けると嬉しいです _ _
6 :
2 :2012/05/04(金) 12:02:37.64
>>3 >>4 さん!
とてもわかりやすい回答ありがとうございます。
早速実験してみます!
>>5 同じ処理がしたいのならやればいいじゃん。
どうしてもポインタが必要な処理なの?
もうちょっと具体的に状況を書いてみて。
8 :
5 :2012/05/04(金) 12:36:54.04
>>7 レスありがとうございます!状況としてはマイコンの制御のためにコードを書いています。
具体的には以下の処理を行いたいです。
// 空行まで変数の宣言です。
struct bit {
unsigned b0: 1;
unsigned b1: 1;
unsigned b2: 1;
unsigned b3: 1;
unsigned b4: 1;
unsigned b5: 1;
unsigned b6: 1;
unsigned b7: 1;
};
union port {
struct bit bit;
unsigned char byte;
};
volatile union port *p2 = (union port *)0x00E4;
unsigned char sw2_before = 1, sw3_before = 1;
if(sw2_before == 0 && p1->bit.b7 == 1)
p2->bit.b4 ^= 1;
if(sw3_before == 0 && p1->bit.b3 == 1)
p2->bit.b5 ^= 1;
ですが、現状だとご覧のように同じようなコードが二回繰り返されているので
これを関数として抜き出したいんです。(空行以降の部分です。)
>>8 マクロで書けばいいんじゃね?
仮にビットフィールドへのポインタが有りだとしたらどんなコードを書く?
10 :
5 :2012/05/04(金) 14:27:08.47
>>9 ありがとうございます!マクロですか、余り使ったことなかったのですが調べてみます!
仮にビットフィールドへのポインタが有りだとしたら以下の様にしたいです。
void led_toggle_switch(unsigned *led: 1, unsigned char before, unsigned char after) {
if(before == 0 && after == 1)
*led ^= 1;
}
led_toggle_switch(&p2->bit.b4, sw2_before, p1->bit.b7);
led_toggle_switch(&p2->bit.b5, sw3_before, p1->bit.b3);
ビットフィールドを使わずに、ビット演算でやれば似たようなことはできるね。
>>10 bit位置を示す引数をもう一つ追加。
ledはビットフィールド変数ではなく、byteの方にすれば、
void led_toggle_switch(
unsigned *led: 1,
unsigned bitPos, // 1-7
unsigned char before,
unsigned char after)
{
if(before == 0 && after == 1){
*led ^= (1 << bitPos);
}
}
14 :
5 :2012/05/04(金) 15:51:10.19
>>12 なるほど、こういうやり方もあるんですね・・・。全く思いつかなかったです・・・。
とても勉強になりました、ありがとうございます!
マクロも自分で書いてみました。スッキリ纏まって良い感じです!
#define LED_TOGGLE_SWITCH(led, before, after)\
if(before == 0 && after == 1) { led ^= 1; }
LED_TOGGLE_SWITCH(p2->bit.b4, sw2_before, p1->bit.b7);
ビットフィールドのレイアウトがどうなるかは未定義だし、 ビットごとに意味を割り当てるにしてもビットフィールドを使わないことが多いね。
もうビットフィールドなんて廃止したら‥‥‥
>>12 レスが付いた後だけど、今見返すと、第2引き数のコメント間違っているね。
誤)
unsigned bitPos, // 1-7
正)
unsigned bitPos, // 0-7
>>14 マクロ関数書くときは各引数を括弧でくくっておかないと、思わぬ動作をすることがある。
#define LED_TOGGLE_SWITCH(led, before, after)\
if(((before) == 0) && ((after) == 1)) { (led) ^= 1; }
随分とマトモな流れなんで、スレ間違えたのかと錯覚したわ。
まあオレのおかげなんだけどな、照れること言うなよな ははは
理解できないからだろ。聞いてやるなw
>>22 >>23 >>16 では無いのだが、ビットフィールドって処理系依存だからでしょ。
LSB、MSG並びと、宣言の順番がどうなるか、とか。
あと、ビットフィールドと共用体の合わせ技もよく使うが、
(
>>8 のportがまさにそれ)
共用体の一方で設定した値を他の型で読んだ時にどうなるかも処理系依存だったりする。
廃止する理由には見えないな
ビットフィールドはハードに依存した並びが必要ないときはどっち向きでも関係ない(1bitでフラグ的な使い方) gccだとarchに依存したエンディアンで並び順は考慮でける コンパイラによっては、並び順をオプション等で指定できるのもある 要は使い分けが出来るかどうか、ビットフィールド ワケワカでやってハマったから、使えないっていう人がいるからね
0と1を入れるだけでも32bit変数を使うような時代にビットフィールドとか過去の遺物じゃないのかね
まさかCでやる全てが32bitのデフォだと思ってるのか? 今世紀最新の遺物だなお前 動く化石だ
H8 の unsigned int は 16bit = 2byte superH は 4byte
組込とかなら今でも現役だったりするのかね
ビットフィールドを絶対使えとかいってないでしょ バカとなんちゃらは使いよう
そりゃそなんだけどさー、ビット演算とか、& | ~ でマスクかけてさくさく書いたほうが、結局楽じゃない? I/Oのビットを立てたり下げたりするのって、普通こうするじゃん? いや、C に 0xc6 表現以外にも 「0b11000110」とかあればもっといいんだけどさー。 この前、5bit ごとにデータをシリアル化したい、ていうお題がどこかであったけれども、そのときもビットフィールドを使いたいとか思わなかったなあ。 ここはビットフィールドじゃないとっ、ていうお題があるんだろうか?
書けるのに読めない人にはわからないことかも
bool型がどうしたって?
組み込みでは現役というか定石ですね。 マイコンメーカーが提供しているヘッダファイルにもバリバリ。
質問です n個の配列を作りたいのですが、下のソースでは、int m[n];の行で constant expected と言われます。どうしたら良いでしょうか。 SHARPのPC-G850VSです。 main(){ int n = 2; int m[n]; }
nはdefine定義しろよ
>>39 ANSI-Cでは配列宣言の要素数は定数でなくてはなりません。
int m[2];
と書きましょう。
ビット単位の操作が必要なケースでレイアウトを気にしないでいいケースっていうのはかなり稀だと思うんだよな。
まぁ、必要っていう人が居るなら要るんだろうけど、レアケースであることにかわりはない。
gcc と vc++ ではビットフィールドを配置する上位下位が逆ってことで一部のライブラリで問題が起こるってことも聞いたことあるし。
gcc にはオプションで vc++ に合わせるモードもあるんだけど、ライブラリとして使う性格上、他のライブラリとの兼ね合いで
一律に逆転してもまずいっていう。 具体的には gtk がそれ。
あと、久々に規格を見直していて気付いたんだけど、ビットフィールドはなるべく詰め込むことが must なんだな。
> 十分な領域が残っている場合、構造体内のビットフィールドの直後に続く別の
> ビットフィールドはは同じ単位の隣接したビットに詰め込まなければならない。
> 十分な領域が残っていない場合、入り切らなかったビットフィールドを次の単位に入れるか、
> 又は隣接した単位の境界をまたがらせるかは、処理系定義とする。
(JISX3010:2003 の 6.7.2.1 から引用)
ここで言う「単位」がバイトのことなのかどうかがわらないんだが、原文ではどーなってんだろ。
いずれにせよ
>>8 のような1ビットが8個の状況では1バイトに連続して配置されることが保証されてる。
あと、ちょっと本質的じゃないがビットフィールドの変わり種の使い方として構造体の代入抑制がある。
幅ゼロで const なフィールドがあると代入できなくなるんだと。
struct A
{
…
const int : 0;
};
てな感じ。
DirectXでビットフィールドはバリバリ現役だったりする
で、貴様らは入門スレで何を話してるんだ おっさんだろ
45 :
デフォルトの名無しさん :2012/05/05(土) 08:56:49.82
> ANSI-ANSI-Cでは配列宣言の要素数は定数でなくてはなりません。
c言語に限らずこういうのを他の言語でも見かけるが、これって何で?
>>39 の例の方が柔軟で良さそうに思えるのだけど。
>>45 ローカル変数はスタックに取るのが普通だから、
コンパイル時に配置を決めてしまいたいんだよ。
>>46 配置を決めたいのが理由じゃねーよ。
隠れて何かしないってのがCのポリシーだからだろ。
決めなくても実現できるのはわかるよな。
つーか、c99なら普通にできるだろ。
前スレでも出たが制限はあるけどな。
51 :
デフォルトの名無しさん :2012/05/05(土) 14:45:42.23
質問おねがいします for文の中で、下のように10倍、100倍、1000倍、10000倍のような計算を 変数”i ”を使って一つに纏める簡単な方法はありますか? よろしくお願いします。 for(i = 1・・・ x = x * 10; -----------ここから下を省略したい-------------------- x = x * 100; x = x * 1000; x = x * 10000;
>>51 この程度がわかんなかったら
後々の学業に支障をきたすレベル
有体に言えば脳障害と見間違う程にひどい
for (i = 1; i < N; i *= 10) { x = x * i; }
i *= 10;
>>55 ホンモノの脳障害の糞詰まりのクソ野郎がお出ましかw
巣にこもってでてくんなアホ
57 :
デフォルトの名無しさん :2012/05/05(土) 14:58:11.12
>>52 ごめんなさいorz
プログラムのプの字も知らず、あるきっかけで数日前にC言語というものを触り始めたばかりですorz
>>53 ありがとうございます。
"i*"が味噌なんですね?
ちょっとやってみます
58 :
51 :2012/05/05(土) 14:59:27.28
>>55 すみませんどこか日本語おかしかったでしょうか?
やりたいことと例示している内容が違ってる気がする 32bit整数だとオーバーフローしてるし
>>51 x = x * 10;
-----------ここから下を省略したい--------------------
x = x * 100;
x = x * 1000;
x = x * 10000;
をそのまま解釈すれば
x = x * 10000000000;
だが、お前がしたいこととは違うんじゃないのか?
日本語ができないならせめて元のコードを示せ。
61 :
51 :2012/05/05(土) 15:04:07.61
>>59 >>60 ああ、そういうことですか
100億なんて数字は使わないし、計算できないですもんね
本当はこうでしたすみません
x = x * 10;
-----------ここから下を省略したい--------------------
x = x * 100;
x = x * 1000;
だからそれならx = x * 1000000; でいいだろが。
for (i = 10; i <= 1000; i *= 10) { x += (x * i); } こういうことだろうか
ここはこの程度と宣う
>>52 に自分が脳障害じゃないってことを示して欲しいとこだな。
やべぇw 脳みそにクソが詰まった人間同士がクソの垂れ流しあいをしてるwww 素晴らしいw 相手はズブズブのシロートなんだから やりたいことくらい察してやれよwww ンなことだからオマイラは脳みそに怪しい部分をお持ちですね とか言われんダよww
66 :
デフォルトの名無しさん :2012/05/05(土) 15:42:37.04
もう全部ソースを晒せばいいと思うんだ。
67 :
デフォルトの名無しさん :2012/05/05(土) 15:47:12.87
やりたいことは察してやるのではなく、引き出してやればいいのだ。
68 :
デフォルトの名無しさん :2012/05/05(土) 16:36:13.95
うんこがなんか言ってるな。
しゃべるクソなんだからしょうがない
>>51 行き詰まったから質問してるんだろうけど、もっと手前で道を間違ったから行き詰まってるんだよ。
例えて言えばお前の質問は「どうやったらこの道を進めるんですか?」と言ってるようなもんだ。
行き止まりの進み方を聞いたってこっちは知らんがなとしか言えない。 そこは進めない。
「どうやったらxxに行けるんですか?」と聞いてくれれば、 xx がどこか言ってくれれば回答しようがあるんだよ。
要は「自分が行き詰まっているところ」じゃなくて「目的地」を示せってこと。
71 :
デフォルトの名無しさん :2012/05/05(土) 17:14:44.10
日本語でおk
72 :
39 :2012/05/05(土) 20:02:31.92
>>48 というと、n個の配列を作る方法はあるのでしょうか。(n=2とは限らない)
73 :
デフォルトの名無しさん :2012/05/05(土) 20:08:19.73
mallocなりcallocでええやん
>>72 無い
そういう方法は標準では用意されてない
最初に配列の個数を決めたら後で変えることはできない
こういうのを静的配列と呼ぶ
実行時に配列の長さnを変えられるのは動的配列、
Cは動的配列を標準では提供していない
「C 動的配列」で調べれば出てくる
コテで無能自慢するのが流行りなんかね
76 :
デフォルトの名無しさん :2012/05/05(土) 20:21:28.26
知らなかったの?おっくれてるぅ
>>72 C99 ではかなり条件が緩和されてる。
http://seclan.dll.jp/c99d/c99d04.htm ただ、ポケコンだと新しい処理系を使うってのも簡単じゃないだろうし…。
普通は malloc でメモリを確保して使うんじゃないかな。
int main(void){
int n = 2;
int* m = malloc(sizeof(int)*2);
//ここで m を使った処理
free(m); // ←メモリの解放
}
コテなしの無能発言よりはまし。NGできるコテつきは良心的ともいえる。
>>78 自己紹介お疲れ様です
これからも駄文の垂れ流し、よろしくお願い致します無能様
>>78 こういう内容の発言なのに自分がコテ付けてないってのは
かなり自家撞着なアホwww
「わたくし、アホでございます」と宣言してるようなモンだw
自己紹介はやめろ
____ / \ /\ キリッ . / (ー) (ー)\ / ⌒(__人__)⌒ \ コテなしの無能発言よりはまし。NGできるコテつきは良心的ともいえる。 | |r┬-| | \ `ー'´ / ノ \ /´ ヽ ___ / \ /ノ \ u. \ !? / (●) (●) \ | (__人__) u. | クスクス> \ u.` ⌒´ / ノ \ /´ ヽ ____ <クスクス / \!?? / u ノ \ / u (●) \ | (__人__)| \ u .` ⌒/ ノ \ /´ ヽ
>>51 同じく初心者が頭振り絞って考えたけど
こういう事かな?
#include <stdio.h>
int main()
{
int x;
int i;
int j=10;
printf(" 整数を入力\nx=");
scanf("%d",&x);
for(i=0; i<=3; i++)
{
x = x*10;
printf("x * %d = %d\n", j,x);
j=j*10;
}
return(0);
}
GNUスタイルは久々に見た 初心者向けの本やサイトでそのスタイルは余りにも見かけない 本当に初心者なのかが疑問に残る 初心者が何もせずに何も見ずにそのスタイルに行きついたなら ある種の教祖的な素質がある
>>84 へぇー。 手元にある本をざっと見たら確かにその通りだわ。
でも、俺も昔は
>>83 みたいに書いてた。
初心者的には括弧の位置が対応してた方が安心できるんじゃないかなぁ。
エディタの支援がある状況だとちゃんとインデント付けてくれるけど、
初心者はそれに慣れてないわけだし。
最初に使ったコーディングエディタがEmacsでショーも無い書籍を避けて進化すれば素養も昔は書いてたもクソもないよ
87 :
デフォルトの名無しさん :2012/05/05(土) 23:22:42.18
日本語でおk
88 :
39 :2012/05/05(土) 23:23:16.24
>>73 ,74,77
有難うございます。とても勉強になります。
私は取り敢えず入門書を大体読み終えたのですが、まだまだですね…
以下のソースでテストしてみたところ上手く動作したので、今自分の作りたいものを作れそうです。
main(){
int n = 2;
int *m = malloc(sizeof(int)*n);
*m = 1;
*(m +1) = 3;
printf("%d, %d",*m,*(m+1));
}
>>86 因みに俺が最初に C のコーディングに使ったエディタは Vz だったよ。
教員もめんどくさいから最近だと VC++ 選ぶと思うけどな。
C の初心者に Emacs から指導するのは手間なだけだろ。
90 :
39 :2012/05/05(土) 23:28:20.64
free(m); 忘れてました
>>88 free するかどうかの議論がまた始まるよー。
for( P=Root, Last=NULL; P != NULL; Last=P, P=P->Next ) この手のfor分は行数ケチスタイル?
そんな変なの見たことねぇ。
うん
>>92 意味的にループのための初期化、判定、インクリメントになってるなら、
ケチとかどうとか言う類のものじゃないと思うけどな。
俺はアリだと思うし、実際に書くよ。
リークの意味がわかってないアホにはうんざり
それはコードゴルフスタイル
LastとRootの語をどう使い分けてんのかわけわからん
とりあえず変数名を大文字で始めるのは気持ち悪い
気持ち悪いね
キャメルケース アッパーキャメルケース ローワーキャメルケース スネークケース あなたはどれ?
レッドスネークカモン
>>84 ,85
pascal の begin / end の段付けを意識した書き方だとこうなるよね。
質問おながいします unsigned int abc; ↑ この変数の中身を指定したビットだけ取り出したり操作したりするのはどうすればいいのでしょうか? 例えば、abc = 0b0000000000000000 として、10ビット目だけを反転したり取り出したりしたい場合です。 よろしくおながいします
>>101 ごめんなさい。もしよろしければそれぞれ教えてください。
>>89 demacs が遅くて Vz も便利に使ってたけど、どこぞのemacsバインドマクロを早々にいれちゃったなあ。
109 :
デフォルトの名無しさん :2012/05/06(日) 00:57:56.53
110 :
デフォルトの名無しさん :2012/05/06(日) 00:58:51.17
んげ ロケール情報までURLに・・・糞Googleが
>>107 ローワーキャメル lowerCamel
アッパーキャメル UppterCamel
スネークケース snake_case
キャメルケースはローワーやアッパーのジャンル名だった。 めんご
へぇ google様はロケール情報まで付け足してくれるのか こりゃあいいこと知ったw ありがとうありがとう さっそく情報抜き出すよ!
#define GETBIT(a,b) ((a)&(b??1)?1:0) #define XORBIT(a,b) (a)^=(1<<(b??1)) int main(void) { unsigned int abc=123; int bit; XORBIT(abc,10); bit=GETBIT(abc,10); return(0); }
115 :
デフォルトの名無しさん :2012/05/06(日) 01:19:04.69
なんだその・は。
彼の脳内にしか存在しえない 素晴らしい演算記号なのだろう きっと
>>115 iPhoneだとゲタに見える
文字コードいくつの文字なんだろ
これじゃね? ≪
114です。 マイナス(-)のつもりが全角で化けてたみたい、すまん。 それと #define GETBIT(a,b) ((a)&(b-1)?1:0) は #define GETBIT(a,b) (((a)&(b-1))?1:0) の方が良いのですね。
>>119 不精せずにcodepad 等で動かしてみれば?
121 :
106 :2012/05/06(日) 03:00:44.55
みなさんレスありがとうございます
とりあえず、
>>111 さんのコードに変数 x を追加して、
x = a & mask;
if(x == 0){printf("10th = 0");}
if(x > 0){printf("10th = 1");}
これでやりたいことができました。
C言語をかじって1ヵ月しかないですが、このスレでは質問すれば有用な返答が頂けて感謝しています。
どうもありがとうございます。
>>121 下のif分はelseにまわした方がよくないか?
というか111がやってるのと逆のシフトを行えば
ifすらいらないぞ
別にシフトすら要らないぞ。 printf("10th = %d\n", !!(a & mask));
printf("10th = %d", (a >> n) & 1);
すいません(つA`)教えてください。 int a,b; dobule c; a = 7; b = 4; c = b / a; と書いたのですが、 %f表記でも、cに値が入っていません。 使っているcは、オブジェクティブcなのでスレチかもしれませんが、教えていただけると助かります。
c言語はよくしらないけど c = (double)a / (double)b; じゃないの?
>>126 ありがとうございます。
早速試してみます。助かりました。
お礼なんていらないよ
Cソースに、関数内に特定の文字列が入っているかどうかを検索し、リストアップできるツールって知ってますか?教えてえらい人。
>>130 >Cソースに、関数内に特定の文字列が入っているかどうか
これ、だいぶぼやっとしていて、何がしたいのかよくわからないが、、、。
grepとか範囲内検索では足りないのかな?
具体的に例を上げてくれれば、レスもらえるかも。
どっちにしてもCの話ではなさそうだが、、、。
132 :
デフォルトの名無しさん :2012/05/06(日) 22:43:01.00
質問があります。 ディレクトリの監視をするのに、inotifyだと、inotify_eventのnameに監視してるファイルを作成/削除/変更 したファイルの名前が入ってると思うのですが、kqueueの場合は、どのように監視しているファイル名を 取得すればよいのでしょうか? よろしくお願いします。
>>131 例えば秀丸だと、grepでは、ソースファイル名とライン数はわかるけど、grepした文字列がどの関数にはいっていたかどうかは、grep先を目視しないとわからないですよね。
私は、ある文字列が、どの関数にある、ということをそういった手間をかけないで調べたいのです。
>>133 >文字列がどの関数にはいっていたか
その「文字列」って具体的に何?
スタック変数なら、関数内だから無関係だよね。
グローバル変数なら、カプセル化がヘボすぎて、管理できなくなってるだけの気がするが。
リストアップしたくなる時点で設計が良くない気がする。
それ以外の文字列なら、用途が想像できない。
まァやるとしたらperlでやるけどね、 どちらにせよ関数の中の変数名を調べたいってのは プログラミングとしては末期症状だとは思う そういうのが必要になる状況てのは かなり切羽詰まっている、 有体に言えばそのソースコードはクズでしょう、捨てなさい
シングルスレッド前提で書いてたコードをマルチスレッド対応に書き直しとか 関数の仕様が変わったので書き直しとかかね
>>133 秀丸は関数一覧を表示していれば、検索でヒットした部分を含む関数もハイライトしてたよ。
grepではどうなるかわからないけど。
>>133 関数/変数ならクロスリファレンサを使えばいい。
ここまでその名前が出てきてないのにびっくり。
カスばかりだな。
本来なら不必要だから。
>>138 何がしたいのかも分かってないのに偉そうな奴だな
察したのか?
141 :
デフォルトの名無しさん :2012/05/07(月) 09:27:17.12
柴田望洋さんと猫でもわかるプログラム読んだけど、なんか極端すぎます・・・ この中間ぐらいの本や、サイト探しています 誰か知りませんか?
何を紹介したって極端だと言うんだろ?
大学が公開してるPDF読めば?
Cでinterfaceってどう書くの? 純粋仮想関数的な書き方ってある?
関数ポインタでごにょごにょ
どう書くの?って言うのは単にCでインターフェースっぽい動作をさせたいだけなのか C++とバイナリー互換を持たせて相互運用したいのかによって変わると思う。
>>149 すげ レスはや。 thx C++とは関連なかとです。
typedef struct _CAGE{
void (*hoge)(....); // = 0; とか入れたいところだが無理か w
int (*hage)(....);
} _CAGE;
こんなのを次のクラス宣言に取り込めばええだけかな?
>>147 インターフェースは、多重継承をやりたくないけれども完全排除もしたくない、というジレンマの上にある妥協の産物。
継承の仕様の一部に制限をかけただけのもの。
C でインターフェースを書くということで、一次近似できたとしても、「制限をかける」ことはできないのでは?
制限なしなんでもありのCにインターフェースとかはなじまない。
実用を考えているならやめておいた方がいいとは思うよ。 インターフェイスがどう実装されているかを考察するとかなら あえて C でやってみるのもいいんじゃない? わかっている人から見れば不毛だろうけど。
153 :
デフォルトの名無しさん :2012/05/08(火) 00:36:31.39
クズとうんこの罵り合いか。
無理矢理、externで宣言/ダミー呼び出しすればリンクエラーには出来るかもしれない。 関数全体をマクロに閉じ込めれば出来なくも無いが可読性最悪。 大昔のC++コンパイラが中間生成するCみたいな。
>>151 ,152,154 おは レス thx
やはりそうなりますか。未実装を検出できなければインターフェースの意味がないもんね w
継承でやります。stateやcompositeやら書いていたらインターフェースで管理したくなってつい不毛な... w
C++? Cortex-M3で、OO利用バイナリを最小にしたいのでちょっと...。
チェックマクロかませればいいだけじゃん。
>>157 assertの事? 入れてるよ w
アグリゲート等の使う側の話じゃなくて、管理の話。 構造体系にも関係するかも?
Mavenの方々 thx
なんだ構造体系て。 別にassertでもなんでもいいが、未実装の検出が目的じゃねーのか。
160 :
デフォルトの名無しさん :2012/05/08(火) 12:56:21.38
型が違う。
Shinayama Programming Change Compilerって何ですか?
>>162 俺にきくなよ
知らないっていってるだろ
164 :
デフォルトの名無しさん :2012/05/08(火) 15:44:25.25
>>151 インターフェイスって多重継承の道を突き進んだ延長上にあるものだぞ
それこそ Cargill が背理法として持ち出した「馬鹿げた想像」が皮肉にも現実化したもので
# 本番稼働で ((void)0) になるだけなものを使って何がしたいんだろうね
C言語であることとインターフェースを使った設計が必要であるかは 全く別問題な気がする。 C++やJavaみたいなオブジェクト指向言語でインターフェースを使った設計が 広く使われているって事はC言語しか使えない環境でインターフェース的なことをやりたい 欲求も当然あるんじゃ無いかな C言語でインターフェースの型情報を持てないのは、言語使用としてサポートしていないと言うだけで それを実装できないというわけでは無いと思う。 例えばインターフェース型の構造体に静的に宣言された型識別子を割り当てて管理することも出来る。 当然可能であればC++で書いた方がよっぽど楽って事にはなると思うけど。
>>160 そこもダメになるサイト。「ポインタp1はstを指す」のではなく、stの先頭要素を指している。
つまり、stは配列そのものではあるが参照されると先頭要素を指すポインタ型になる。
&stとした場合はstは配列だから当然に、配列を指すポインタ型になる。
そのサイトを書いた奴はその辺りを判っていないと思われる。
>>160 例えばそこのページの最後にある、
>このとき str == str[0] == &str[0][0]
はナンセンス。
str[0]と& str[0][0]は型が等しいから比較できるが、strは型が違うので比較しても意味が無い。
敢えて比較したいのならば、(void *) str == (void *)str[0]とするべき。
言葉で書くなら、strとstr[0]は(型は違うが)アドレスは等しくなるとするか。
そもそも、初心者は「アドレスの概念を強いられているんだ!」と怒ってもいい。
168 :
デフォルトの名無しさん :2012/05/08(火) 16:34:59.80
なんのこっちゃ。
C言語を強いられているんだ! 的な?
やばい、つまんないこと書き込んでたらご飯のスイッチ入れる忘れてた
171 :
uy :2012/05/08(火) 17:54:57.30
172 :
デフォルトの名無しさん :2012/05/08(火) 18:15:44.09
言語解析(コンパイラ)の授業大学でやってるけど、さすがに Cのアルゴリズムコード出して試験はしないよね? オートマンとか、左再帰とかそういうのしかやってない....
おっ盛り上がってるな!
>>164 純粋仮想関数をnewすると実行でアサーションエラーになります。 使う話で恐縮だが。
それでも、インターフェース機能が存在するのは、マストな存在だからです。
チップ組込みも肥大化しつつありますが、それに増してPC上でビッグプログラムを開発すると、
構造設計段階での有難みが身に染みます。
しかし...、CでのOOPは慣れれば快適 w
もちろん、メッセージドリブン、イベントドリブンや仮想関数テーブルのライブラリを完成させてからの話だが w
このスレ見てると、単なるCの文法の話なのか、ソフトウェアやネットワークと C言語の関連の話なのか全然分からない。
>>165 ReactOSでC言語でCOMオブジェクトを実装しているのは見たことある。
C言語でインターフェース作らなくても、javaにあるんだからそれ使えばいいじゃん。 既成機能のほうが優れているし早いんじゃないの?
>>173 お前はいったい何が言いたいんだ。
日本語に不自由なのか?
C言語の知識深すぎる人ここ多いけど、そんだけ知識あるなら エンジニアでもなればいいのに。
高級言語って機械語を指示する言語なんだから、理論的には 他言語の機能だって、あらゆる手段を組み合わせて実装できるんじゃないの?
別に実践的になんでも実装できるがどうかしたか。
高級言語で機能実装したら絶対スピード遅くなるだろ。
今時のCコンパイラより速く書くのは大変だぞ?
184 :
164 :2012/05/08(火) 19:18:18.01
>>173 それはもしかして C++ の話?
だとすると純粋仮想関数は new できないんだが・・・
# スレチすまそ >ALL
> CでのOOPは慣れれば快適
ここは同意
C しか知らないと他の言語を漁りに行く動機がなかったりなw
# 知人にいるんだこれが
185 :
デフォルトの名無しさん :2012/05/08(火) 19:32:27.61
このスレ絶対初心者スレじゃない。 東大生でも理解できんぞ。
上級者ほど理解できないとも思うがw
C言語なら俺に聞け(応用編)って作ればよくね?
188 :
デフォルトの名無しさん :2012/05/08(火) 19:43:14.48
上級者は次元が違うってか? 馬鹿よせよ。 C言語のコーナーじゃ文法の本がほとんどじゃ。 俺の知ってるC言語じゃない!
俺の知ってるC言語じゃない! (このスレはね。)
専門的な奴でも、親切に噛み砕いて教えてくれる人と、 自分本位で専門知識ひけらかすアホがいるよな。
まったく、どうしてアホはこうも傲慢なのかね。
インテリ傲慢は講師になるなよ
難しい事でも噛み砕いて教えてくれる本があれば、1万ページでも 1か月で読める。
194 :
デフォルトの名無しさん :2012/05/08(火) 20:02:55.58
K&R をガチ幼稚園児を前提に書くと何ページくらいになるかな
いい加減、つまらんから間抜けなことばかり言うのよせや。
196 :
デフォルトの名無しさん :2012/05/08(火) 20:05:16.61
その言葉、そっくり返すぜ C の話をしろや
アホは黙ってろよ。
親しみにくいからソフトウェア離れが増える。 あまりに基礎技術が進みすぎると誰もやりたいと思わん。 そういう意味で90年代後半のほかほかITブームの流れにのったやつは運がいいよな。
プログラマーとかなりたいやつ皆無だろ。 汗流すほうが健康にもいいし楽しい。
全く雇用が守られてないからな 文理不問で学歴不問で未経験者OKで 数年毎に新しい技術が出てきて蓄積が無意味になるんじゃ 若くて素直で人件費の安い奴隷が優先されてコストのかかる頑固な年寄りは切られるよ その方が企業にとって都合がいいからそういうシステムになってるんだろうね全く人間がモノ扱いだよ
プログラマーはつまらんよ 趣味で好き勝手やるのが一番
202 :
デフォルトの名無しさん :2012/05/08(火) 20:33:21.85
好き勝手は別に趣味でなくてもできるぞ かみ砕いてやると創造性の発揮というやつだ これができない奴は PG 以外でも結局同じこと
203 :
デフォルトの名無しさん :2012/05/08(火) 20:35:38.37
204 :
デフォルトの名無しさん :2012/05/08(火) 20:44:44.92
ブーメランw
ここ 入門スレじゃない
すみません、質問です。
http://codepad.org/XAPbYL9u のコードが、コンパイラによって処理が出来たり出来なかったりします。
これは、このプログラムのなかに問題があるのか、それともコンパイラ側に問題が有るのでしょうか?
因にコンパイラはandroidアプリのc4droidとc/c++コンパイラです。
前者では失敗(十進数では~の下りが表示されない)、後者では成功しました。
プログラムが汚いのはスマートフォンで組んだからです。お許しを。
よくわからんがcontを初期化しないで使ってるな
あ、良いのかなスマン、スルーしてくれw
>>207 さん
ありがとうございます!
あんな事に気づけないとは...
下らない質問失礼しました。
QをNGにするとすっきりするよ
#defineについてお聞きしたいことが御座います。 とある環境のソースを別の環境で移行する為に、変数の値の置き換えを行いたいです。 Aプロジェクトで「Mouse.Trg&_lMOUSE」と書いているソースを、 Bにて「System.touch.trgFlag」で呼び出せるようにしたいです。 #define Mouse.Trg&_lMOUSE System.touch.trgFlag #define Mouse.Py System.touchPos.y と書いてみたのですが「Mouse.Trg&_lMOUSE」の「.」と「&?」が原因でエラーが出てしまっております。 このようなことはできないのでしょうか。 警告 warning: missing whitespace after the macro name エラー error: expected primary-expression before '.' token
>>211 マクロ名は「識別子」であり、識別子として有効でない名前を指定することは出来ない。
>>211 日本語がわからんがきっとこんな感じか。
#if PROJECT_A
# define MouseLButton() (Mouse.Trg & _lMOUSE)
#elif PROJECT_B
# define MouseLButton() System.touch.trgFlag
#endif
皆様、ご回答ありがとうございます。
やはりこのようなことは#defineでは出来ないのですね・・・。
>>213 様
アドバイスありがとうございます。
その場合、両方のソースでMouseLButton() に置き換える感じなのでしょうか?
変数だけで指定することが出来ない場合、その方法を使用させて頂くかもしれません。
ありがとうございます!
>>215 Bでstruct Mouoseを用意して適当に値を詰めるって手もあるが。
ないな。
お前がな。
「return 0;」と「return (0);」の記述の仕方見るんで 違いやどっちがより正しいとかでもあったりするのかちょっと気になって 検索で調べたんだけどこれと言って見つけられないんだけど 何か知ってる人いるかな?
文法上括弧は不要。 つけてるのは勘違いしてる間抜けだけ。
return 0; は普通。 return (0); は神経質。 return(0); はおっちょこちょい。
retrun(0); は救いようがない。
#define retrun return
void retrun(int x); が死ぬ。
フリーのcコンパイラっていろいろあるみたいですけど おすすめとかってありますか?
>>227 WindowsならVisualStudio Express(C++)
MacOSXならXcodeフリー版
その他Unix系OSならgcc
でおk
229 :
227 :2012/05/09(水) 18:40:21.19
ありがとうございました
いえいえ
フリーのcコンパイラ Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland Digital Mars Compiler Version 8.42n Copyright (C) Digital Mars 2000-2004. All Rights Reserved. Written by Walter Bright www.digitalmars.com/ctg/sc.html Open Watcom C/C++32 Compile and Link Utility Version 1.9 ( Open Watcom C32 Optimizing Compiler Version 1.9 )
フリーのcコンパイラ License LCC is free for personal use ... LCC (compiler) - Wikipedia
日本語つかえるのか?
ワロス
C machineはもう公開してないんだな。
237 :
濡鼠 :2012/05/10(木) 11:39:31.82
はじめまして。 今、H8マイコンでC言語を勉強しているのですが、 実際に現場で使うのでしょうか?
238 :
デフォルトの名無しさん :2012/05/10(木) 11:51:18.37
VisualC++での話ですが、コードを書いてデバッグなしで開始で実行 した際に、消したにも関わらず、一回前に書いたコードが何故か実行され、新しく書いた 方が実行されません。何故でしょうか?
いっぺんくりーんしてみろ
>>238 プログラムの使い方はスレ違い。
C++の話でもスレ違い。
ビルド失敗したんじゃないの?
>>237 現場でH8を使うかどうかはスレ違い。
H8の開発現場でCを使うかどうかもスレ違い。
H8は生産が終わったので今更やっても無駄 現場じゃ使えない せめてSH-2かARM系
>>237 使うぞ
>>241 C言語の勉強と書いてあるじゃないか。 H8かどうかなんて関係無い。 よく見てレスしろ! カス!
うるせーカスだな。
もう手に入らないものの勉強したってしょうがないのにね
245 :
デフォルトの名無しさん :2012/05/10(木) 14:04:53.78
へえ
ふーん
ルネサスも品種減らしたいので統合前の製品を色々切ってるんだよな H8じゃなくH8Sなどならまだしばらく売るだろうけどね 量産なら一円でも安いものを選択するだろうが 入門なら後々まで役に立つものを選びたいね RXはかなり微妙だったが…
ふう
そういえば VAIOのキーボードコントローラー IO EXPANDERに H8S2149使ってたな〜
C言語のプログラム全部提出しないと単位くれないって鬼畜なん?
そんな学校入るなよ
必修単位ならどうせ簡単な問題だろ
C言語のおかげで留年しましたよ。 本当に恐ろしいわ。
>>194 数学の参考書で一行ごとに丁寧な説明があるのとかあるが
C言語の解説書もそうして欲しいよなww
馬鹿馬鹿しいと思うことでもビギナーにとっちゃ永遠に分からない事かもしれんし。
C言語に触れて、初めてプログラミングっておもしれぇって思った
と同時にめんどくせえって思った
C言語に触れて、 ・彼女が出来ました! ・宝くじがあたりました! ・昇進しました! ・道端で500円を拾いました! ・
K&Rってどうなの?
259 :
デフォルトの名無しさん :2012/05/11(金) 07:20:52.42
KuriとRisu ?
>>244 C言語の勉強でH8をたまたま使っているだけだろ。
それともなにか、C言語は手に入らないってこと言ってるのか?w
IDE無かったら絶対に再帰なんてトレース出来んかったわ。
IDEの意味知ってる?
ハードディスクだろ?
SASI/SCSI/IDE
しょーもねーやつだな。
だなw。
Integrated Development Environment
>>206 で下らない質問をした者ですが、またも質問です。
http://codepad.org/UAQSRi2n がvisual c++2010では実行できて、Tiny C compilerを利用したIDE(学習用c言語開発環境)では実行できません。
具体的には、37行目からのprintf文に問題があるようですが、その警告文がよくわからないです。
警告文:unknown escape sequence: '??x81'
どなたか宜しくお願いします。
269 :
デフォルトの名無しさん :2012/05/11(金) 23:53:18.43
全角空白
さいきんのコンパイラさんは全角スペースも半角スペースに変換してくれるのかい?(" "内の全角スペースを除いて)
全角空白を消して実行しましたが変わりませんでした。 そもそもエラーが起きるのが37行目なので全角空白にも問題はあると思いますが、解決にはなってないみたいです。すいません。
272 :
261 :2012/05/12(土) 00:02:35.50
273 :
268 :2012/05/12(土) 00:02:54.53
>>271 時々あるのが、エディタ上の文字エンコーディングの設定によるエラー
メンドクセーから コマの名前全部アルファベットにしろ FuとかOuとか
そこで再帰ですよ。
にゃ?
278 :
268 :2012/05/12(土) 00:16:25.54
もう少し考えてだめだったらアルファベットにします。 ありがとうございました。
再帰の宿命はよ
にゃにゃ?
>>278 問題は31行目と54行目。
puts("−−−−−−−−−−−−−−−−−−−−−−−−");
に変えれば解決する。
なんで?
いやまあいいけどさ別に そこまで教えてあげたなら、ね
お前が教えろよ。
>>283 "―" はシフトJIS では 0x81, 0x5c。
0x5c は '\' (バックスラッシュ)で、これは C のエスケープシーケンスの始まりを示すね。
で、問題のコンパイラは、一文字目の "―" の後ろに続く、二文字目の "―" の最初の 0x81 をエスケープシーケンスの2バイト目と解釈してしまった。
無論、\ + 0x81 に相当するシーケンスは定義されていないから、エラーとして表示された。
こんなところでいいかな?
>>268 玉方と王方の区別は?
単にそのコンパイラが日本語に対応してないからだろ。
>>287 さすがだね
出来るやつは後進の育成にも積極的なのは世の常
290 :
デフォルトの名無しさん :2012/05/12(土) 00:56:19.60
出た、クズの自演。
292 :
デフォルトの名無しさん :2012/05/12(土) 00:58:48.26
ト リ プ ル 自 演 乙。
なんか自演妄想してる人がとってもかわいそうに思えてきた いいんじゃないですか?そう思っておけば
そうだね、クズはクズだし。
出た! 自演を演出するための自演。 シフトjis なんて fat32 が現れた時点から死滅する運命だろうなと思っていたんですが、現実には10年を超えた今でも長生きしていますね。
海外のオープンソースのプロジェクトに参加してみたいんですが、どう探せばいいですか? 停滞しているプロジェクトにいきなりアプローチしても反応がなさそうなので、 活発そうなところを探したいです。英語はできます。
スレ違い。
ありがとうございました。よかったらどこへ投稿したらいいか教えてくださると幸いです。。
include <stdio.h> void main(void) { printf("C言語始めました。"); printf("先輩方よろしくお願いします。"); }
300 :
299 :2012/05/12(土) 02:05:31.38
// \nがねえワロス
#もねぇ。。
302 :
299 :2012/05/12(土) 02:45:38.93
クソッ クソッ 手元にビジュアルスタジオさえあれば間違いなんてすぐ分かるのにヘタレすぎワロタ
BS11 報道原人「“ネット右翼"の素顔を見た」
2012年5月12日(土) 8時30分〜9時00分
ゲスト:安田浩一(ジャーナリスト)
中国や韓国などに対して過激な批判を展開する「ネット右翼」。
会員数1万人以上を誇り右翼団体の中でも最大規模となっている組織も存在する。
実際にネット右翼を取材したジャーナリスト・安田浩一氏は、一人ひとりに会ってみると、
おとなしい今どきの若者たちが多いという。
http://www.bs11.jp/news/1349/
>>299 C:\>gcc test.c
test.c: In function `main':
test.c:4: warning: return type of 'main' is not `int'
>>305 // 理解不能です
// printf scanf if whileしか理解できません
>>305 よく見たらWindows環境だったけど
gcc test.c
なんて書かれてると不安を覚えるなあ…
いや、コンパイル後の扱い次第なのはそうなのだが
>>306 [int] main()
mainの前のintは省略可能≠void
RPGとかのキャラ情報って全部構造体に入れるんでしょうか? HPや攻撃力などの要素がかなり多い場合、どうやって管理するんでしょうか 何百行にも渡ってtypedef struct〜とか書くんでしょうか
その手のデータはcsvファイルにまとめといて そこから読みだす できれば、そのcsvデータを作る別のプログラミも作る
csvよりはYAMLっぽい表記をパクるなりしてkey=value なのを階層的にずらずら並べていったほうが柔軟性、拡張性は高い。 敵: 名前=毒スライム 属性=毒,混乱 毒: 確率=10% ダメ=1-8 備考=3回刺されたら即死 てな感じで。 例えば備考のような項目はデータとして存在していてもプログラム側ではとりあえず無視して 将来対応するようにしても良い。 何にしても型に頼らずデータで表現するというのが重要。
アクションですらかなり項目があるからRPGとか管理で死ねそう
314 :
268 :2012/05/12(土) 20:14:21.81
>>281-287 自分が見ていないときに回答されていて驚きました。
実際にputs関数の中を変更したら、実行できました。
これは、要するに全角記号だとコンパイラによって処理がかわるから、全角記号は避けたほうがいいということでいいでしょうか?
>>287 とりあえず表示したかっただけなので、まだ区別は考えていません。
>>314 >全角記号だとコンパイラによって処理がかわるから、全角記号は避けたほうがいいということでいいでしょうか?
今回、コンパイルできなかったときのコンパイラは、シフトJIS に対する作りこみがなかったんですね。
まあ、それが普通でしょう。
確かに日本語とか全角とかある種の半角カタカナとかはやめておいたほうがいいかもしれません。
シフトJIS - CP932 は、さまざまな問題をはらんでいるにもかかわらず Windows やその前から使用されているですが、一概に反旗をかかげるわけにもいかなくて。
ユニコード騒動での誰得感が払拭できないのは、私がふるーい人間だからかなあ?
317 :
268 :2012/05/12(土) 20:39:14.27
>>316 理解できました。いい経験になったと思います。
ありがとうございました。また質問に来るかもしれませんが、よろしくお願いします。
318 :
デフォルトの名無しさん :2012/05/12(土) 22:55:09.04
プログラミングの単位2年連続落として1留した。 腸煮え繰り返る思いだ。 説明悪すぎるんだよクソ教授。癌になってしんでほしい。
>>318 わかんなかったら、わかるためのあらゆる努力はしたのかい?
受け身の学習法では、今後社会に出てから困るよ
>>320 社会に出たら、単位取りゲーム得意な人間程うまくのしあがるんだよ。
大学の勉強何かで無駄に頭使いたくないね。
確かに正論ではある。 プログラムの知識ない奴プログラミングの腕はすごいw
アンドロイドアプリ難しすぎ。
アプリ作るのがホントに難しいのか、それとも……
>>322 つまらん、必要ねーだろこれっていう知識がどこで生きてくるかわからない
セレンティピティーとはそういうもの
まあ、人それぞれ考え方はあるけどね
×セレンティピティー ○セレンディピティー
インターネット無し時代に独学した人スゴいな。
インターネット時代の現代では、知識も均質化してきてるので 厳しい時代だのう。。
>>329 書籍とか処理系のマニュアルとかで勉強してたよ
borland の日本語WinAPIヘルプはものすごく使いやすかった MSDNのヘルプもあれくらい軽量高速なヘルプにするべき
今はヘルプどころかOSも統合環境も重いからな
335 :
デフォルトの名無しさん :2012/05/13(日) 08:37:39.24
>>330 そう思い込んでるやつが増えただけ
わかってない奴が使えない点は何も変わってない
1行目と無関係な結論の例です。 1 そう思い込んでるやつが増えただけ 2 太陽が東から昇る点は何も変わってない
337 :
デフォルトの名無しさん :2012/05/13(日) 08:55:28.24
均質化なんかしてねえってことだよ (こんなとこで挙証する気はねえぜ) Wiki の丸暗記で天狗になってるだけで、何かやらせようとするたびまたネットサーフィンだけで自分の創造をしないやつはいらねえ そういうクズと10を要求したら12くらいやってくる逸材が全然ちがうのは今に始まったことではない # やれやれ、ここまでかみ砕いかにゃわからんとはな 2ちゃんにもググレカスと鳴くだけでそいつ自身は空っぽなやつがごまんといるだろ
>>337 >(こんなとこで挙証する気はねえぜ)
すれって。
「いらねえ」やつが「いらねえ」という当たり前のことにスリカえとらんで。
340 :
デフォルトの名無しさん :2012/05/13(日) 09:27:09.34
>>335 そうかねぇ、
本で勉強しないで、ネット検索してわかったつもりになってるやつが
増えてきてる気がする
凄く初歩的なことなんですが、for文の条件って計算してから分岐するんですか? それとも終わった時に計算するんでしょうか? 例えばfor ( a=0; a=5; a++ )の場合、何回分↓の処理を実行することになるんでしょうか
for (0;1;3){2}
continueの挙動が関わってくるからwhileじゃ表現しきれないんだよバーカ!
qzaのだけはrunしないほうがいい
351 :
344 :2012/05/13(日) 13:14:43.81
なんで俺がいまさらfor文の書き方を勉強せにゃいかんのか?
for(A;B;C)D;
の場合、ABD;CBD;CBD;CB...
Bの条件で終了するなら、ABD;CBD;CBD;CB
間違っても
決して、ABD;BCD;BCD;BC...
ではない。
>>344 語尾に「?」つけてみればわかる。
a = 0; START: if(a = 5) goto END; ... a++; goto START; END:
355 :
デフォルトの名無しさん :2012/05/13(日) 14:16:37.53
相変わらず簡単な問題のときにしか出てこないクズにワロタwww
356 :
344 :2012/05/13(日) 14:17:13.39
>>352 俺が断定しなかったのは、コンパイラの設定によってはビルド自体ができないからだよ
まあ、こんな質問にそこまで考慮する必要はないんだろうけどね
359 :
デフォルトの名無しさん :2012/05/13(日) 14:33:20.32
そんなうんこスレばかり貼るな。
360 :
デフォルトの名無しさん :2012/05/13(日) 14:38:34.38
C言語プログライング能力試験1級のコツ
362 :
デフォルトの名無しさん :2012/05/13(日) 17:21:53.86
>>346 それは「goto だけは使わない」人が自らを詰ませている滑稽な図式だ
for の continue に代わる動作くらいどうにでも作れるさ
オナニストに子作りの方法語られてもニントモカントモ
main.cpp(40) : warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1>c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(237) : 'fopen' の宣言を確認してください。 #include <stdio.h>を宣言してあるのにfopenしたらこんなのが出てくるんだけど何が原因でしょうか?
366 :
デフォルトの名無しさん :2012/05/13(日) 17:48:36.26
子作りの方法は全然ちがうんだが よっぽどひどい育てられ方をしたんだな そんなに重篤な精神分裂を来すとは
>>364 > This function or variable may be unsafe. Consider using fopen_s instead.
この関数、または変数は安全ではありません。 かわりに fopen_s を使うことを検討して下さい。
> To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
非推奨を無効にするには _CRT_SECURE_NO_WARNINGS を使って下さい。 詳細はオンラインヘルプを参照のこと。
c言語ってスレ違いなの?
370 :
344 :2012/05/13(日) 19:17:44.18
MS独自拡張はスレ違いじゃね?
/) ///) /,.=゙''"/ / i f ,.r='"-‐'つ____ こまけぇこたぁいいんだよ!! / / _,.-‐'~/⌒ ⌒\ / ,i ,二ニ⊃( ●). (●)\ / ノ il゙フ::::::⌒(__人__)⌒::::: \ ,イ「ト、 ,!,!| |r┬-| | / iトヾヽ_/ィ"\ `ー'´ /
その切り分けが可能な人はここに聞きに来ないよ。
373 :
デフォルトの名無しさん :2012/05/13(日) 19:46:19.68
いや、C++がスレ違いだ。
#include <stdio.h> #include <stdlib.h> int main(void) { int t; system("cls"); for(t=0;t<12;t++){printf("\n");} for(t=0;t<19;t++){printf(" ");} printf("中心"); for(t=0;t<12;t++){printf("\n");} for(t=0;t<40;t++){printf("_");} return 0; } DOS画面の真ん中に「中心」って文字を表示するのに 変数tを複数のforで使いまわして作ってみたんだけど コンパイルでエラーは出ないものの使い方としてはどうとかあるかな? 検索でダメってのは見かけないけど大丈夫とも見なくて不安がある
問題ないお
curses
PDCurses (Public Domain Curses)は UNIX以外の DOS、Windows、OS/2など向けに作られた curses とほぼ同じ機能を提供するライブラリである curses - Wikipedia
>for(t=0;t<19;t++){printf(" ");} >printf("中心"); for(t=0;t<19;t++){printf(" ");} printf("%*s", 42, "中心");
単にループ変数の使いまわしについてしか聞いてないのに、 そこまでして知ったかぶりたいものかねえ
>>375 構文としては意図した意味になっているし、
賢いコンパイラを使うのであれば、性能上の問題はないと期待できる
だからあとは、書き方としてお行儀がいいのかという問題だが、
「スコープは最大限狭める」という原則に従うなら、こう書くこともできる
for(int t=0;t<12;t++){printf("\n");}
for(int t=0;t<19;t++){printf(" ");}
printf("中心");
for(int t=0;t<12;t++){printf("\n");}
for(int t=0;t<40;t++){printf("_");}
しかし、これはC89ではできない書き方であるし、
ほとんど差がないのも間違いないので、提示のように書いたとしても問題ないと思う
衒学的に考えるなら、桁方向のループ制御変数と行方向のループ制御変数を分けるべきと言う意見もありそうだ。
エスケープシーケンスでカーソル移動は駄目なの?
>>380 「ANSI.SYSドライバでANSIエスケープシーケンス」
CにもRubyにもcursesライブラリがあるよ
マジックナンバーをどうにかしる!
for文の条件式の部分で、例えば int i,a; scanf("%d",&a) for(i=1;i<=a;i++){ } とかってできないんですか?エラーがでてしまいます。 これができれば指定した数分の掛け算表ができて便利なんですが... やっぱり一々ソースを書き直したりしないといけませんか?
390 :
デフォルトの名無しさん :2012/05/14(月) 14:32:07.77
エラーなのはお前の頭だろう。
あ、セミコロン(´;ω;`) 教えてくれてありがとうございます!
いえいえ
お前みたいなただのカスのがもっといらねぇだろwww
質問です。 画像を移動したいんですが、真横や真縦はx,yをそれぞれの値になるまで足して描画を繰り返すのは分かるんですが、 少しずれたところに移動させるのはどういう式になるんでしょうか。 例えば、x0,y0からx200,y0は出来ますが、x0,y0からx200,y45が分かりません。
わからないぷー
0,0と200,45を結ぶ直線の傾きは? yを1増やすにつき、xをいくつ増やせば良い? 少数が必用なので、少し頭を使うかもしれんが。 プログラムじゃなくて、算数の問題。
>>396 簡単にするには座標を浮動小数点で持って1回に動かしたい量をそれぞれに
足しこんでいけばいい。
ああ、やっぱり小数点の公約数なんですね…特別な関数があるかと思ってました。 ありがとうございます。
おまえらってC言語に関しては天才なの?
今時は小数点に公約数があるのか...
>>401 天才じゃないと答えられないような質問あったか?
最近は A:xxxについて教えて。 B:yyyだよ A:ありがとうございます C:いえいえ という返信をする変人がいるらしい。
>>396 (0, 0)から(200, 45)に滑らかに移動したいと言うこと?
(200, 0)を経由していいなら横と縦に分割できるじゃん。
x+20、y+4,5とかね
408 :
デフォルトの名無しさん :2012/05/14(月) 19:48:15.34
一様乱数教えてくださいな
409 :
デフォルトの名無しさん :2012/05/14(月) 20:00:06.95
randam()
410 :
デフォルトの名無しさん :2012/05/14(月) 20:14:45.18
混合合同法ってなんですか
#include <stdio.h> int sum(int,int); int main (void) { int value,Left,Right; scanf("%d,%d",Left,Right); value = sum(Left,Right); printf("%d\n",value); return 0; } int sum(int min,int max) { int num; num = (min + max) * (max - min + 1) / 2; return num; } scanf("%d,%d",Left,Right); この部分にエラーが出ました... 何が悪いのでしょうか?
&
あ、&(´;ω;`) またまた凡ミスしていまいました どうもです...
いえいえ
いえいえ禁止!
417 :
デフォルトの名無しさん :2012/05/14(月) 22:58:41.47
C言語で円周率を10桁求めるプログラム作りたいです。 ソースコード教えてください。 このプログラム作るの簡単ですか?初心者です。
printf(”3.141592653”);
>>420 それだめらしいです。
もう一つ
二次方程式の解を√つきで実数だけ全て求めるプログラムも教えてください。
実行例
a.out
x^2 ? ←出力
1 ←入力
x ? ←出力
1 ←入力
定数 ? ←出力
-1 ←入力
x^2+x-1の解は ←出力
y=(-1+√5)/2
y=(1+√5)/2
みたいな感じのプログラムです。
期限は円周率とこの二次方程式のプログラムセットで3週間です。
後4日です...徹夜で考えてるけど特に二次方程式のプログラムは
思いつきません...
>>422 アホかお前
出直してこい
何もわかっちゃいねーーーーーーー
プログラムの前に中学生の数学からやり直せ
ミジンコ
徹夜ワロタwww
πの計算は、
>>421 が終わると、今度は多倍長計算がやってみたくなる
ライブラリ一切使わずに加減乗除だけで自力で組んでみるとなかなか面白いよ
円周率は、可能なら10桁ってことで、3.14以上、つまり4桁以上を出せれば とりあえずOKらしいです。(という噂) 二次方程式は、解が無しなら、この解無しみたいな出力もするプログラムです。 後4日。お願いします'--'(手)
427 :
422 :2012/05/14(月) 23:24:51.29
y=(-1+√5)/2 y=(-1-√5)/2 でしたね。すいません
430 :
428 :2012/05/14(月) 23:41:01.12
ソースみりゃわかるとおもうが、例えば√4とか平気で表示すっからなwww あと、小数(分数)になっても、小数点以下完全無視だからwww それがいやなら、これをベースに徹夜するのだwww
431 :
428 :2012/05/14(月) 23:52:28.29
それから重解表示もふつーに√0なwww まあ、がんばれwww もしかしたら、プロさんがすばらしい式整形盛りこんだやつ作ってくれるかもね
433 :
428 :2012/05/15(火) 00:18:27.64
435 :
428 :2012/05/15(火) 00:44:59.36
#include <stdio.h> void check(int y[]) { printf("check : %d\n", sizeof(y) / sizeof(y[0])); } int main() { int x[5]; printf("main : %d\n", sizeof(x) / sizeof(x[0])); check(x); return 0; } 両方とも5が出力されると思っていたのですが mainは5でcheckが1になります。 check関数のyはmainのxそのものを別名でアクセス出来るものかと思っていたのですが checkが1になる理由は何なのでしょうか。よろしくお願いします。
438 :
436 :2012/05/15(火) 01:29:13.51
>>437 なるほど。そうなるとmainの中のxは配列を指しているわけではないという事でしょうか
sizeof(x)ってやって5になるってことはそうなんですよね・・・
今まで配列の名前自体は配列を指してるってイメージだったんでちょっと頭こんがらがってきました
解答ありがとうございます
439 :
436 :2012/05/15(火) 01:31:09.17
ポインタだと思ってるんだったら1になるのが当たり前って思うべきなんですよね なんか言ってる事めちゃくちゃでごめんなさい。
>>438 main の中では配列だけど
関数の引数で渡された時点でポインタになる
441 :
436 :2012/05/15(火) 01:52:10.42
>>440 すいません。ありがとうございました。
勉強し直してきます。
VisualStudio2010 ver 10.0.40219.1 sp1relを使用しています。 少しポインタを復讐しようと思いまして、入力した文字から最大値と最小値を出力するプログラムを書きました。 ソース(きたなくてすいません) #include<stdio.h> void maxmin(int *array,int *max,int *min); int main(void){ int array[10]; int max,min,i=0; do{ scanf("%d",&array[i]);i++; }while(array[i-1]!=-1 && i<10); maxmin(array,&max,&min); printf("最大値:%d\n最小値:%d\n",max,min); } void maxmin(int *array,int *max,int *min){ *max=0;*min=100; for(int i=0;*(array+i)!=-1 && i<10;i++){ *max = (*(array+i) > *max) ? *(array+i) : *max; *min = (*(array+i) < *min) ? *(array+i) : *min; } return; } これをVisualStudioで実行すると構文エラーが起きてしまいます。ただ、bcc?ではエラーは起きませんでした。 maxmin関数内のiの宣言をforの中ではなく、一番上で宣言するとVisualStudioでもエラーは起きませんでした。 少し良くわからないので、教えてくれる方いたらお願いします。
>>443 ANSI-Cでは変数の宣言は複文の先頭にしかかけません。
これは予想ですけどVC++ではCとしてコンパイル、BCCではC++としてコンパイル
しているのでは?
もう一つ、mainが戻り値を設定していないので、警告が出ます。
コードの中身はチェックしていませんので、悪しからず。
>>443 VS側はコンパイラのオプションでエラーを出さない様に出来る。
>>438 配列名は式中では配列の先頭要素へのポインタとなる。
ただしsizeof, &のオペランドになったときは例外。
>>444 すべて仰るとおりです。すごいですね!!
VisualStudioでcppで作成し、mainにreturn 0;を追加したところコンパイルできました。ありがとうございました。
>>445 ありがとうございます。
オプションがどこにあるかよくわからなかったので、cppとして作成しました(^_^;)
いえいえ
いいぇいいぇ
イェイイェイ
君と ウェイ! ウェイ! ウェイ! ウェイ!
いっつだってワークワーク
453 :
デフォルトの名無しさん :2012/05/16(水) 04:02:50.68
通常正であるコストを、無限のコストとして-1を設定したときに コスト同士の比較で、コストが最小となるものを求めるときに //cost1,cost2,minはint min=cost1; if ((unsigned)min > cost2) min=cost2;・・・(1) 上のif文と(完全にではないですが)同等の条件として if(min == -1 || (min > cost2 && cost2 != -1) ) min = cost2;・・・(2) (1)のような(unsigned)-1 = INT_MAXを使った書き方は推奨してよいものなのでしょうか? 標準Cでは、符号あり→符号なしの変換はbit列を維持することが保証されているようですが、 具体的には(unsigned)-1のような使い方は、一般的に使われているのかが知りたいです
Cの仕様としては保証されないが使われてるね。
そもそも (unsigned)-1 = INT_MAX が成り立つ保証がない。
entryの宿命はよ。
>>456 それは見えないが処理系依存と書いてるんじゃないのか?
そもそも符号付整数を1の補数であらわすのか2の補数であらわすのか
あるいは別の形式かも処理系依存だろ。
だろ。!
理解できないからって恥ずかしいやつだな。
処で、どっかにLinuxのtmpfile()のソース落ちてないかな。
このスレと何の関係が?
Cの標準関数やから。
handle closeとファイル消去の紐付け方法を 判んない思いつけないんでしょ462は
466 :
462 :2012/05/16(水) 16:34:47.06
いや、単にファイル名をどう生成しているか知りたいだけ。 creat()してすぐunlink()していることは想定内。
>>462 オプソなんだからそりゃどっかにあるだろ
glibcでググればいいと思う
Cの仕事ってあんの?
うん
C言語のプログラム上からpythonのプログラムを実行したいです
はい、すれば良いかと思います。
>>467 あ、盲点だった。
ってことで、早速glibcのgitwebを見てみた。
stdio-common/tmpfile.cを見たら、中で__gen_tempname()を呼んでいた。
で、tempname.cを見ると……中身が__set_errno()だけだった(TT
LinuxでCの勉強をする場合定番のコンパイルは何ですか? VC++2010無料版のcl.exeしか知りません
つgcc
わかりました gccで勉強します
>>473 system("python yourProgram.py");"
gccしか使わなくね?
479 :
デフォルトの名無しさん :2012/05/17(木) 18:59:16.56
一様に乱数が発生していることを検証するプログラムを コードに追加すること. 確認方法は,生成した乱数の発生度数を階級毎にカウントし, その各度数を表示する. また,発生した乱数が一様になっていない場合は, 改めて一様乱数を生成する部分の修正を行うこと.
いえいえ
481 :
デフォルトの名無しさん :2012/05/17(木) 20:47:00.97
ある数列が一様乱数であることの証明ってすげー難しそう どのような予測も未来永劫すべて退けるってどうやるんだ
それが出来ればチューリング賞もフィールズ賞も夢じゃない! ガンバれ! おれはやらんけど!
ふう はら減った
うん
487 :
デフォルトの名無しさん :2012/05/17(木) 23:30:52.93
#include<stdio.h> int main(){ int num1, num2, num3, num4; printf("整数1 : "); scanf("%d", &num1); printf("整数2 : "); scanf("%d", &num2); num3 = num1/num2; num4 = num1-(num3*num2); printf("%d を %d で割ると %d 余り %d\n", num1, num2, num3, num4); printf("%d を %d で割った小数値は %f\n", num1, num2, (float)num3); return(0); } で、num1に17、num2に5と入力して、%fの所に3.400000と表示したいんだけど3.000000と表示されるのは何故?
なんでintで割り算してんだアホ
>>488 ×なんでintで割り算してんだ
○なんでint を intで割り算してんだ
491 :
デフォルトの名無しさん :2012/05/17(木) 23:41:34.86
>>489 キャスト(だっけ?)について教えてくれますか?
intを変えろ あとは分かるな
以下は同一ですか? sizeof(array) / sizeof(*array) sizeof(array) / sizeof(array[0])
>>493 Just try and you can find out.
ためしてみな、そうすればわかるさ
>>487 floatは必要に迫られない限り使うのは避けよう。
%fより%gを使おう。
>>481 このケースだと階級毎にカウントとか書いてるんだから
単純にカイ二乗検定すればいいんでしょ
数列のテスト方法は大量にあって、TAOCPはそれだけで一章使ってた気がする
>>496 >%fより%gを使おう。
これはお勧めできない。%g は値によって出力結果が大幅にかわり事前に予測できないのが非常に問題。
安易につかって破綻し泣ごにょごにょごにょ
あほすぎwww
>>499 printf("%f, %f\n", 1e10, 1e-10);
printf("%g, %g\n", 1e10, 1e-10);
どっちが自然?
C言語の入門者向け練習問題サイトってありませんか?
問題1)1から10までの数値をランダムに生成せよ 問題2)大吉 中吉 末吉 吉 凶を表示するおみくじを表示せよ こんなやつ
ステマかよ 宣伝したいサイトが出てくるまで粘るんだろどうせ アホはさっさと立ち去れよ
出た出たw過剰反応w
どっちにしろここで聞くよりググった方が早いな
とりあえず Project Euler はやっておくかな
プロジェクトオイラーは簡単な奴なら入門レベルでも解けるけど、 難しいのだと数学的知識がないとどうにもならない
すみません構造体のことで教えてください、あるサイトで main.h struct Images{ int hero; 以下省略 }; main.cpp int LoadFiles(){ //ファイル読み込み処理をここに書く g_images.hero = 以下省略 } とあるんですが、「images.hero」でそのまま使えないんでしょうか? なぜg_を付けているのか、何の意味があるのか分からないです
>>510 それだけ提示されても何のことやら。めんどくさいから全部貼れ。
ついでに質問もよく判らん。
まぁ、g_で始まっているからにはグローバル変数とでも言いたいのではないかと思うが。
変数名とタグ名の区別がついてない
タグ名はImagesだぞ。目は大丈夫か?
標準ライブラリの質問はココで質問してもいいですか?
>>510 構造体はただの鋳型
使うにはそこから変数などの形で実体を作る必要がある
たぶんソースのどっかでg_を付けた名前で変数宣言してるだろ?
>>514 おk
お前らのおかげですっげーお手軽なお遊びゲームできたwwww 数字の1を入力するだけで戦闘できて、しかも自分のHPは減らない、うは面白www これで毎日暇潰せるwww お前ら本当ありがとうwww しんでくる
517 :
デフォルトの名無しさん :2012/05/18(金) 16:04:56.62
argvの内容を4番目以降消して、 (argvの要素数は4以上あるものとする) 後でその領域を使えるようにしたいです。 void main(int argc, char* argv[]) { while (argc>3) argv[--argc]=NULL; } これでは文字列の内容がちゃんと消去されてないし、 指していたメモリが開放されていないと思うのですが、 正しい方法を教えてください。
518 :
デフォルトの名無しさん :2012/05/18(金) 16:19:08.24
二次元配列を渡す時の仮引数の書き方を教えてください。 二次元配列を渡す時、受ける側はポインタの配列で受けるのでしょうか。 また、二次元配列を渡す時の実引数は、何を渡したらいいのでしょうか。
typedef struct{int hairtsu[SIZE][SIZE2];}hairetsu2jigen; void f(hairetsu2jigen a);
>>517 汎用性のある手段はない。一般的には、メモリ解放を意識する必要もない。
>>518 配列を渡したいのか配列へのポインタを渡したいのか要素へのポインタを渡したいのかはっきりしろ。
つーか、その辺りが判らないなら具体的にやりたいことを書け。
>>517 検索して調べてみた感じだと、
argvがどういうふうに確保されるかは環境依存だから、
freeしようとするのはやめとけって感じでした。
freeしないとしたら空文字列を代入すればいいのかな?
>>520 ありがとう。
逆にいうとargvのために確保された領域が
勝手に他から読まれる心配はしなくていいってことですか?
セキュリティの観点からも気になるんだけど。
523 :
デフォルトの名無しさん :2012/05/18(金) 16:37:25.05
>>519 それだったら始めからグローバルな二次元配列を書きます
>>520 上位の関数で二次元配列を宣言して、下位の関数にアドレスを渡して、下位の関数で二次元配列の処理をしたいのです。
>>521 の質問は、
while (argc>3) argv[--argc]=NULL;
と
while (argc>3) argv[--argc]="";
だったらどっちがまとも?
っていう内容です。
519に対してグローバルがどうとか言い出すあたり全然わかってない割合の方が高そうだな
526 :
デフォルトの名無しさん :2012/05/18(金) 17:00:08.05
>>519 さんのやりたいことがわからないのですが。
構造体を返そうとしてるつもりなのでしょうか。
そうだとしたら何故return値がvoidなのでしょう。
Cは値渡ししかできないですよね。
もしそうでないとしても、それなら何故仮引数が構造体を指すポインタじゃないのでしょうか。
構造体はreturn出来るから構造体のメンバーに二次元配列を宣言したのでしょうが、何をしたいのかわかりません。
教えてください
>>525 さん
自分の中の理屈で逆切れかます欠陥人格
>>526 二次元配列とか、そこらの本見れば書いてあるだろ。
人のミスにつけこむような、つまんない議論やめれ。
void f(int a[2][2]); void f(int a[][2]); void f(int (*a)[2]);
「仮引数の書き方」の話が「値を返す書き方」に変わっているような気がする。 自分の無知を棚に上げて挑発的な態度を取っているように見えるのは気のせいか?
>>526 >525じゃないけど答えてみる。
>518では「二次元配列を渡す」と書いてあって二次元配列を参照渡しした意図はどこにも書いてない。
従って、値渡ししている>519のやりたいことは自明。
配列を戻すことを考慮する必要がないのだから、戻り値がvoidなのも至極当然。
フルボッコw
>>524 どっちもまともじゃない。
引き数リストは使用しないのなら放っておけばいい。
「勝手に他から読まれる」のは何を想定しているのか判らないが、
それを心配するなら>524のどちらであろうとも全く無意味だ。
>>531 s/参照渡しした意図は/参照渡ししたいとは/
535 :
デフォルトの名無しさん :2012/05/18(金) 17:25:03.78
>>520 さんに指摘されたように、もっとはっきりとやりたいことを書くべきでした。すみません。
本買って勉強してきます。
プログラミングの本と常識の本を。
>>535 一転して素直で、今度は人格が心配になる。
まあガンバレ。
ふう
>>533 argv[1]=argv[3]
argv[2]=argv[4]
の後に、argv[1]とargv[2]を使った操作
をやるので、argv[3]とかargv[4]
をどっかでいじられると困るわけです。
strcpy使えばいいのか?
判らん人だなぁ。何の保証もないコードを幾ら捻っても詮無いだろうに。 関数に渡すために無駄な心配をしているのなら、 オリジナルのargvを渡さずローカルにコピーしたlocalArgVでも渡せばいいだろうよ。
いじろうとしてるのはお前だけのような気がするが
>>538 勘違いかもしれんが、それだとコピーじゃなくてポインタのすげ替えにしかなってないんじゃね?
たしかに危なっかしいな。
>>538 誰から守ろうとしてるの?
デバッガでアタッチされて改変とかの心配?
>>542 mainを起動した本人以外が文字列の内容を読む心配。
argv[3]='\0'
したところで、argv[3][1]以降に入ってた文字は残骸としてメモリに残ってるんでしょ?
C++だと勝手にデストラクタが発動するからライブラリの責任だけど、
Cだとゼロ埋めとか自分でするの?
543だけど、C初心者なんで、まずは慣習的な方法を教えて欲しいだけなんだ。 うっとうしかったらすまん。
んなつまらん事気にするなら main/argvじゃなくてmainCRTstartupをまづ如何にかしようとするべきだな
>>545 やっぱC系はわけがわからんな。危ない橋をわたらされてる感が・・・。
嫌味じゃなくて素朴な疑問なんだけど、不安で夜も眠れないとかならないの?
argvに書きこみなんてしないのが慣習 自分でゼロ埋めたって、埋める前に読まれたらおしまい プロセスの保護とかOSの話 言語関係ないだろ
>>547 ふむふむ、argvに関しては納得。
いろいろ見てたら
memset(str,'\0',sizeof(str))
ってのが出てきた。
たしかにゼロ埋めじたいはやるみたいね。
strcpyってセキュリティホールの源泉みたいね。 機会があったら使わせてもらうわ(笑)。
(馬鹿は)何使っても一緒だから心配すんな
argvに入ってるってことはプロセス起動した側も同じものを持っているということ。 受け取り側だけどうこうしても片手落ち。 送り側にも手を入れられるのならコマンドライン引数では渡さない。 受け取り側のプログラム差し替えられたらダダモレでしょ?
おまえらってC言語どのくらい出来るの?
553 :
デフォルトの名無しさん :2012/05/18(金) 19:29:29.24
質問お願いします。
入力された金額に対して、最も少ない紙幣と硬貨の数になるように計算せよ。
という課題に取り組んでいるのですが、なかなかうまくいきません。
現状では以下のようにしているのですが何が間違っているのか分かりません。
アドバイスをいただけたら幸いです。
http://codepad.org/JVbJI7BZ
javascriptでいう var d = new Date(); d.getFullYear(); みたいなオブジェクトとメソッドをピリオドで結んだ形で書くのはどうやって書けますか?
>>501 %g がいかなるものか正確無比に把握できているのであれば %g を使用すること、%gの方がわかりやすい結果を出力するという事実に依存はない。
しかし、%g が、あるときは固定小数点表示、あるときは浮動小数点表示に切り替わる、その切り替わりタイミングは正確に記述されているのだろうか?
あるいは正確に記述されているとしてパンピーに把握できる内容だろうか?
凡人の私には
http://codepad.org/9vnPdoW3 の結果をあらかじめ予想することは不可能。ましてや自分のコード変更がめぐりめぐってどこぞのコードに影響することなど、把握不可能。
したがって、あるときから素性が比較的わかる %f にしておくのが無難という考え方に組することにしている。
この問題、wsprintf() 等で現実に直面する場合もあると思う。
どこかのだれかがなんの理由かしらないが、すべての実数値に 1e7 をプラスすることにしたために、めぐりめぐって泣ごにょごにょごにょ
>>553 プログラミング以前に、中学・高校あたりの数学からやり直したらどうかな。
あなたは、数学的に物事を考える能力が無いよ。
>>554 structのフィールドに関数ポインタぶっこめば可能は可能だけど
結局a.foo(&a);とself/this相当を引数で渡さないといけないアホなことになるw
>>517 posix/execv*() 群を使用するとき、「argv を malloc() していいの?malloc() した argv はどうなるの?free() しなくていいの?」とこちらできいたことがある。
答えは、「ほっとけ」。
なぜだろう?
>>559 えっ
質問者本人だけど、まだ見てるから回答ヨロ。
exec()系は自分自身は存在しなくなるのだからfree()できるわけないじゃん。 malloc()したポインタをexec()する先に引き継げるなら別だけど、普通そんなことしない。 従って、exec()した先のプロセスがお亡くなりになるときにOS側に引き取って貰えばいいよ。
>>561 一理あるけど、現代的なプログラミング言語しか触ったことのない俺にとっては、
Cの常識ってお行儀悪いなーって思う。
ただ、それだけ。べつに歯向かおうとは思ってない(笑
>>555 そうか? 実に判り易いと思うが。
6桁で丸めた結果が整数なら小数点を省略する。それだけだ。
まさかとは思うが、製品版のアプリにまで適応する話と思ってないだろうな。
製品版なら、値域を厳密に判断してから出力するからそれこそ適材適所だ。
学習目的で実験的に使うと言う前提だからこそ、必ず小数点以下6桁も0が並ぶ方が不自然だろ。
そうそう、極小値で割った結果をそのままsprintf()で%fを使って出力するプログラムがあったよ。
結果は、スタックを食い潰して落ちる最悪なものだったがね。
>>562 それはあんたが低レベルの振る舞いに慣れていないからだろ。
システムコールを直接扱おうとしたらその手の問題にはしばしば直面するぞ。
>>564 それは自覚している。
ハイレベルのことだけやってて困らない。
だから唯一困るのがargvとかIOまわりなんだよね。
そこでどうしてもCと相互作用しないといかんくて。
これから勉強しようと思うんだ。
ヘネシー・パターソンとか読めばいい?
>>563 製品でなくても
>値域を厳密に判断してから出力するからそれこそ適材適所だ
に深く同意します。
>>556 確かに、私は数学が苦手で数学的に考える能力は乏しいです。
おっしゃる通り、プログラミング以前の問題だと思います。
しかし、学校の授業の関係でやらなければならないので困っております。
また、これからもこの課題の考え方が必要になってくると思うので
この掲示板に書き込みさせてもらいました。
まずはこの板の宿題スレを探しだすんだ
枚数はxを割って求める
>>563 >極小値で割った結果をそのままsprintf()で%fを使って出力するプログラムがあったよ。
%f といえども大きいほうには無限にひろがるから‥‥
無限に広がるわけないだろ。
事前に値をチェックすることなしに、バッファオーバフローを避けられないのが%fの宿命。
いまさらだけど、なんだ、 strcpy(argv[1],argv[3]) って普通にヤバイじゃんw argv[1]=argv[3] でargv[3]を消さずに放置するのが正解だな。 このスレ的にはargvをいじるなボケ、という感じだろうが、許してくれぃ。
演算を細切れにして都度OF見ればいいだけの話し
>>568 宿題スレに丸投げしたら答えだけ分かりそうで、意味は理解できない
かなと思ったのでこちらに書きましたが、556さんの言う通り数学的
思考力がないと意味がない気がしてきました・・・。
>>569 ありがとうございます。割り算を使ってこれから試行錯誤してみます。
しかし、つくづく2000円札って影薄いな。
ゲームボーイアドバンスのゲームをC言語で作りたいと思うのですが 一般のC言語入門の本を読んでも全くわかりません。 何を学べばいいですか。
gbspec.txt
僕らのゲームボーイとかいう本が出てるからそれ買え 組み込み系の良い教材になるよ
>>582 その本は持ってますが、入門書とその本とのギャップが大きすぎてサッパリ。
その間のギャップを埋めるにはどうしたらいいでしょうか。
割り込みとかレジスタを叩くあたりは組み込み系の入門書を読まないと分からないかもしれないな リンカとかローダあたりの知識もあったほうがいいなそれはエキスパートCプログラミングあたりに書いてあった気がする グラフィック処理はインデックスカラー形式だからそれはファミコンのプログラミングとか調べたら分かるかもしれない あとはネット上でサンプルコードを漁ったり試行錯誤するといいんじゃね
585 :
デフォルトの名無しさん :2012/05/18(金) 23:23:46.91
思うんだが、ネットってプログラミングの知識ですら書籍に適わないよな。 ネットは浅く広過ぎ。
ソレは
>>585 自身が語録不足だからだと思うよ
ひょっとして語彙のことか?
語彙
589 :
デフォルトの名無しさん :2012/05/18(金) 23:32:07.93
>>586 体系的に教えているサイトは浅い。
深い事載せてるサイトは、単にユーザーが気になって
実験してみました的な事。
定説的に深い事言ってるサイトって無い。
590 :
デフォルトの名無しさん :2012/05/18(金) 23:35:28.31
定説的ってなんだ。
詳しい事ほどヒットしないからな だいたいネットに情報載せたら本売れなくなるじゃん。 専門的な事や創造的な事はネットに書くわけ無い。
質問がないなら帰ってくれないか
語録ww
595 :
デフォルトの名無しさん :2012/05/18(金) 23:49:57.57
アホスwww
>>584 組み込み系の専門書読んだけど10pくらいで挫折した。
もっと分かりやすく書いて欲しいな。
598 :
デフォルトの名無しさん :2012/05/19(土) 00:35:48.28
なんで末尾再帰を区別するのか、理由すら考えたことがないんだろうね。
>>596 >int f(int n) {
>return (n == 0) ? 1 : n * f(n - 1);
>}
>
>ですら末尾再帰ではないことになるのでしょうか?
末尾再帰では有りません。
「ループに変換可能か」と言うより
「ジャンプ最適化可能か」です。
なお、c言語では末尾再帰最適化を行わない処理系も多いので、
処理系依存度を下げたいなら、末尾再帰に拘る必要は有りません。
>末尾再帰であるために
>
>int f(int n, int i, int p) {
>return (n == i) ? p : f(n, i + 1, p * (i + 1));
>}
>
http://codepad.org/OSvQa0ni >と書かねばならないのでしょうか?
Yes。
ただしgccなどの一部の処理系では上記部分を関数内関数で書けるので、
呼び出し側からはint f(int n)で済ませることが出来ます。
>>600 >「ループに変換可能か」と言うより「ジャンプ最適化可能か」です。
call A
end
A:
...
ret
...
call A
ret
ならば
A:
...
ret
....
jmp A
になるということですか。昔、せこいことに call A / A: ... call B ret / B: ..... call C ret / C: ... ret を call A / A .. jmpB / B: ... jmp C / C: ... ret にしていた、というやつですね。
もう少し考えて見ます。コメントありがとうございました。
a
>>580 まずは任天堂と開発者ライセンスの契約を結ぶところからかなー
>>601 Schemeの継続の考え方が参考になると思う。
>>584 ありがとうございました。
ただそういった知識を身に付けても、例えばDSだったりPSPだったり
対象が変わるとまたARM9とかMIPSとか調べないといけないですよね?
C言語というのは文法とか構文みたいなのは同じでもそういう
ハードウェアの知識が必要なのですか?
ハードウェアの知識がまったく必要とされない分野で Cを使うのはあまりにも生産効率が悪すぎる。
>>606 C言語自体は本当に言語としての土台の部分しか規定してない
その土台の上に何が乗っかるかで学ぶべきことが変わるなんてザラよ
とは言え、その土台がしっかり出来てりゃ乗っかるモノが変わっても対応しやすいけどね
外人が作った開発環境があったような気がするけど それの使い方調べればハードのこと考えなくても作れた気がするけど
#include<stdio.h> int main(void) { char h1[4][3] = {"あ","い","あ","い"}; char h2[2][3] = {"い","あ"}; int a=2,b=1; if(h1[a]==h2[b]){ printf("成功! [%s],[%s]",h1[a],h2[b]);} else{ printf("失敗! [%s],[%s]",h1[a],h2[b]);} return 0; } 配列使って文字の比較やりたいんだけど エラーはでないものの「あ」「あ」の組み合わせでも 「失敗!」になってしまって困ってます。 配列使っての文字の比較ってどうすればいいでしょうか?
>>611 ==で比較したらだめだよ
アドレスの比較になってしまう
strcmp()で比較しないと
614 :
611 :2012/05/19(土) 11:37:32.28
いえいえ
>615 気に入らん。もう一度やれ!
そりゃそうだろC言語単体じゃ役に立たないコンソールプログラムくらいしか作れないよ
>>617 お前が作るコンソールプログラムこそが役に立たないんだろw
質問です #include <stdio.h> #include <stdlib.h> int main(void) { char *ip; ip = getenv("REMOTE_ADDR"); printf("%s\n", ip); return 0; } において(null)しか返ってこないのですが環境によって動作しない事もあるのですか?
>617 ハードの詳細な仕様書があってもライブラリが無いから使えないって言いそうなやつだな。
>620 >REMOTE_ADDR >REMOTE_ADDRは、アクセス元のIPアドレスを表します。 >つまりあなたのホームページやCGIに対してアクセスした人がつかんでいるIPアドレスです。 httpサーバー経由の実行でもなきゃNULLが普通じゃね?
>>622 単に”IPを取得する”ものだと勝手な先入観で思い込んでしまっていました
ありがとうございます
ちなみにC言語において実行元のIPを取得する関数は存在しますか?
>実行元のIP これが全くもって意味不明なんだが
環境依存
>>624 表現に悩みましたが、実行者のIPで伝わるのかな
C言語うんぬんよりも先に HTTPとかネット関係とか そっちの方をやった方が良いだろコイツ 今のままじゃあ話なんて通じねーよ ムダだよ
cgi作りたいならC言語よりPHPとかPerlとかのスクリプト言語の方勉強したほうがいいよ。
>620 IPアドレス持つにはTCP/IPプロトコルが必要。 TCP/IPプロトコルの無いハードなんていくらでもある。
すいませんLinuxとC言語の質問はどこでしたらいいですか?
631 :
630 :2012/05/19(土) 17:01:14.05
Linuxでいいエディタがないので自分で作りたくて質問したいんです
vimでもemacsでもgeditでもだめってこと?
普段
>>630 はどんなエディタ使ってるんだろ
>>629 調べて意味を理解できました、ありがとうございます
指摘通りネットワークの知識が薄いみたいなんで勉強してきます
今は皆さんC初心者に優しいよね。Cマが増えても誰も困らないからかな。
>>635 そうですか?あいもかわらず冷たいと思っています、C がわからなければ人じゃない、っていう雰囲気はいつまでも払拭されない、という気が。
637 :
630 :2012/05/19(土) 21:49:40.05
>>632 秀丸
vimとemacsは難しすぎてエディタの使い方を覚えないといけないから時間がかかります
geditは機能が足りないので不満です
そこで秀丸にある機能で自分で使いたいものを自分で実装して使いたいんです
その理想のエディタを開発するためにもまずはIDE使いこなせ
639 :
デフォルトの名無しさん :2012/05/19(土) 21:57:02.97
現在公立の中学生(1年)なんですが、C言語を始めたいと思っています。 中学の時点でC言語の理解は難しいでしょうか? 日本で小学校高学年や中学生でC言語というかプログラミングやってる 人は少ないですか?周りにいないので。
BASICみたいな使い方なら出来るだろう でもポインタとか構造体を使うにはちょっと難しいかもな 高校生になればだいたいできると思う しかし小学生でプログラム組んでた奴もいるから結局は個人差か
厨房がC言語やるなんて早いんだよ。 部活やったり友達と遊んだりする事に時間を使え
>>639 CDブートのknoppixをUSBから起動させれば
あなたもたちまちCマスターどころかイッパシのハカーになれます
はっきりいって年齢は関係ありません
適性だけです
プログラミングなんかやったって何にもならないただの徒労で終わるよ 学生なら部活やら人付き合いやら勉強やら資格の勉強やらに費やすべき プログラミングなんかやったって受験で有利になるわけでも良い会社に入れるわけでも 出世競争で有利になるわけでも金が儲かるわけでもなんでもない プログラミングに時間を費やすというのは完全に人生をドブに捨てるのと同じで愚かな行為 受験勉強を頑張りなさい
>>637 だったら自分で新しいエディタ書くよりpythonでgeditプラグイン書いたほうが速いと思うが
タイトルの俺って誰ですか?
Cの最大の難関はこんな役立たず言語覚えてどうするんだという疑問が払拭できず モチベーション維持が極めて難しいということだな。 そこさえ乗り越えられれば何歳だろうと習得は簡単。
言語を作りたいのですがそういう場合でもC言語を覚えるのはやめたほうがいいですか?
初歩的なことで申し訳ないんですが、 1〜40までの整数があって 1〜20を白、21〜40を赤 みたいにしたいとき、 1〜20 の ”〜”の部分は どう表現すればいいんですか?
>>649 ちがうんじゃねーの?
Cで出来ることがほとんどやりつくされてるからじゃね
デガラシいじくりまわしても楽しくないじゃん
・覚えるの 早めた方がいいですか? ・覚えるのは 止めた方がいいですか? どっちなのかと。
>>651 あなたの質問は、if文の条件の書き方を知りたいと言うことですか?
でとすれば、if (整数 >= 1 && 整数 <= 20) 白();のようにすればよろしいかと。
>>651 >1〜20 の ”〜”の部分は
>どう表現すればいいんですか?
「波線」。
いえいえ
俺に言ってんだよ。
>657 が壁に向かって言ってるんだろ。
Yeah Yeah
イェーイェー
ドットインストールで充分だろ。
ドットインストールは中身薄くてダメだ そこで動画公開してる低レベル野郎のステマか?
どーせ動画で見に付くわけないんだ、本人が判った気になるだけのために金を出すのは馬鹿馬鹿しいってこと。 それこそドットインストールがどうこうって、ソフトバンクのステマかっての。
668 :
デフォルトの名無しさん :2012/05/20(日) 12:00:05.03
>>649 役立つ言語がもしあると今度は立場がなくなるやつが何か吠えてるなw
C言語が身に付くレベルの理解力があれば他の言語の取得も容易っていう目安になる。
なるね。
なるかなあ?
とりあえずここが人が多そうだからここにきたんですが 総合的な質問スレってありませんか?
>>672 ここが総合的な質問スレに見えるならそういうことにしておけ
double nanashi(double MAX,double MIN) //MINからMAXまでの実数乱数を返す {return ((double)(rand()%(int)((MAX-MIN+1)*POINT))+MIN)/POINT;} 実数の乱数を返す関数を作りましたが思ったような動作を行いません 記述を間違えているのでしょうか POINTは10^4くらいです
>>675 (MAX-MIN)*rand()/RAND_MAX+MIN;
>>676 0から1までの乱数を生成して、大きさ(MAX-MIN)をかけMINの分を底上げするんですね
助かりましたありがとうございます
678 :
678 :2012/05/21(月) 01:47:42.52 BE:950591227-2BP(0)
rot13暗号を解読するプログラムでEOFを使わないプログラムが分かりません。
680 :
678 :2012/05/21(月) 02:20:17.16 BE:678993825-2BP(0)
>>679 getchar使わない文でお願いします。すいません
>>680 fgetc(), fputc() は使っていいかい?
682 :
678 :2012/05/21(月) 02:24:58.37 BE:678993825-2BP(0)
>>681 すいませんが、習い始めで
getcharを習い出したばっかりで、
ちなみに自分で作った文だとデバッグエラーが出るんです。
#include<stdio.h>
int main(void)
{
int rot;
while(rot >= 'a'&&rot <= 'z')
{
if('a'<=rot && rot<='m')
rot = rot+13;
else
if('n'<= rot && rot<='z')
rot = rot-13;
}
return 0;
}
こんな感じです。
>>682 >自分で作った文だとデバッグエラーが出るんです。
「デバッグエラー」、というのは具体的にどんな状態になるのかな?なにかメッセージがでるとか。
684 :
678 :2012/05/21(月) 02:41:48.37 BE:814792526-2BP(0)
Debug Error! Program: C:\Users\名前 \Desktop\ROT13\Debug\ROT13\.exe Module: C:\Users\名前 \Desktop\ROT13\Debug\ROT13.exe File: Run-Time Check Failure #3-The cariable'rot'is being used without being initialized. (Press Retry tu debug the application) っていう表示のウィンドウが出ます。。。。
int rot=0;
>>684 hello world の表示は出来た?
687 :
678 :2012/05/21(月) 02:53:16.56 BE:407396423-2BP(0)
>>685 int rot = 0; だと、終わってしまいます。
>>686 出来ました。
なんでもかんでも出来ないわけではないそうです。
>>687 そりゃそうだろ
>>682 はrotの入出力やってないもん
でもエラー出なくなったろ?
>>684 のエラーはそういう意味
どこかで入出力文があれば初期化も不要なはずなんだが
>>684 それは rot に値がはいっていないよ、ってことですね。
たしかに、
>>682 では rot の値がきまっていない。(rot をどう処理するかはかいてあっても。)
で rot に値をいれればいいのですが、どんな感じにしますか?getchar() で標準入力から掘り込み、printf() で表示するとかが適当だとおもいますけど。
なにか希望があれば教えてください。
あとプログラムを作成している環境(コンパイラの種類とか)もわかるのなら教えてください。もしかして web でやっているのでしょうか?
690 :
678 :2012/05/21(月) 03:03:44.46 BE:4888750289-2BP(0)
>>688 #include<stdio.h>
int main(void)
{
int rot;
while(rot >= 'a'&&rot <= 'z')
{
printf("%c\n",rot);
if('a'<=rot && rot<='m')
rot = rot+13;
else
if('n'<= rot && rot<='z')
rot = rot-13;
}
return 0;
}
これでprintfを足したんですが、同じエラー文?が出ました。
691 :
678 :2012/05/21(月) 03:09:58.26 BE:3327066277-2BP(0)
>>689 希望はないんですが、あまり複雑なモノはまだ習ってないので遠慮したいです。
なんちゅーか プログラム云々の前にチラシの裏にでも理解出来たと思う部分を書き出してみて 自分の頭ん中をデバッグするところから始めるべき
>>690 最後に一つだけ
「入出力文」と書いたのは悪かった
「入力文」の方が正しいな
エラーの理由はrotを初期化しないでいきなり
while(rot >= 'a'&&rot <= 'z')
なんてやってるから undefined、つまり「鼻から悪魔が出てきても知りませんよ」という事
697 :
678 :2012/05/21(月) 03:32:42.36 BE:3259166786-2BP(0)
#include<stdio.h> int main(void) { int rot,loop; loop = 1; scanf("%c\n",&rot); while(loop <=100) { if('a'<=rot && rot<='m') rot = rot+13; else if('n'<= rot && rot<='z') rot = rot-13; scanf("%c\n",&rot); } return 0; } ここまでいったんですが、+13とか-13がされません。。。
698 :
678 :2012/05/21(月) 03:52:08.79 BE:4277656297-2BP(0)
一応友達のアドバイスもあって、 プログラムが出来ました。 ありがとうございました。 #include<stdio.h> int main(void) { int rot,loop; loop = 1; while(loop <=100) { scanf("%c",&rot); if('a'<=rot && rot<='m') rot = rot+13; printf("%c",rot+13); if('n'<= rot && rot<='z') rot = rot-13; printf("%c",rot-13); } return 0; }
>>697 手が加わったのはいい感じです。
rot13 の処理に問題はありますが、とりあえず
>>697 に沿って動くように訂正すると
http://codepad.org/ikiHqIJW scanf("%c\n", &rot)
の rot は
char rot;
でないとうまくうごきません。
int rot;
だと'c' を入力したつもりでも、実は場合によっては rot が 'c' にならないことがあるのです。
>>698 ありま?
でも、それ、うごいているようにみえるのは偶然ですよ、たぶん。
int rot;
じゃなくて
char rot;
じゃないと‥‥‥
701 :
678 :2012/05/21(月) 04:06:51.43 BE:1357986454-2BP(0)
>>700 そうなんす。
変な文字まで現れて・・・
charでやってみます。
>>701 >変な文字まで現れて・・・
X printf("%c",rot+13);
O printf("%c",rot);
X scanf("%c",&rot);
O scanf(" %c",&rot);
703 :
678 :2012/05/21(月) 04:32:59.41 BE:1222188629-2BP(0)
>>702 変な文字は出なくなりました。
あとは+と‐がされなくて
'a'を入力すると'aT'と表示されたり・・・
>>703 今のソースをそのままideoneに貼れ。
難問:金環日食が見れるプログラムを作成せよ
つまんね。
◎
Q1:一番信頼できるソートアルゴリズムは何ですか? A1: Q2:一番早いソートアルゴリズムは何ですか? A2:
以下、 A1: 俺が書いたコード ←禁止。 A2: 適材適所 ←禁止。
710 :
デフォルトの名無しさん :2012/05/21(月) 15:31:25.04
ユークリッドの互除法ってどう実装してますか? int m,n,tmp //m,nに対する入力は省略。m≧nとする。 while(n!=0){ tmp=m%nセミコロン m=nセミコロン n=tmpセミコロン }
セミコロンをそのままカタカナで書いてくるヤツは初めて見る 新種のアホか? 新手のバカか?
些事にやたらとこだわるパラノイアが今日はあちこちのスレに出没しているようだな こういう奴はウザいから書き込むな
>>710 だってさ
ユークリッド互除法の実装なんて些事はどうでもいいってさ
当たり前だろ アルゴリズムは擬似プログラムなんだから手順すらわかればいい それをちゃんと動くように書き換えるのは読んだ人の仕事
言語を作りたいんですけどどうやって作ればいいか教えてください 最初はつの関数だけ実装できればいいです hello()って関数を実行したらHello Worldを返すプログラムが作りたいです
716 :
デフォルトの名無しさん :2012/05/21(月) 15:42:11.94
C言語でも出来るよ
拡張子はspl(shoshinsha programing language)にして コマンドラインからhello.spl(hello.splの内容はhello()だけ)
720 :
デフォルトの名無しさん :2012/05/21(月) 18:05:58.77
手順すら?
さっさと教えろよ
MSに依頼する。
max = (ar[i] > max) ? ar[i] : max; このような?を使った文で、どちらか片方を省略(この場合は:右側のmax) することはできないのでしょうか?何か効率のいいやり方ありませんか?
>>723 まずはその?を使った文とやらは
ホントはなんて言うのか
そこら辺から自力で調べろよアホ
教科書少しも呼んでないだろ
for (; i < end && ((max < a && max = ar[i++])||~0); );
for (; i < end && ((max < ar[i] && max = ar[i])||~0); ++i);
>>723 それ宿題スレのだろ
limits.hが使えればINT_MINなどあり得ない最小値を代入しておいて
前の値と今の値を比べて大きければ今の値を代入すれば三項演算子は不要になる
IOCCCにでも出すのか?
>>723 素直に
if (ar[i] > max) max = ar[i];
が効率は一番いいだろ
>>727 max = ar[0];
で初期化でいいじゃん
宿題スレを見てきたら「トリッキーな奴を頼む」と書いてあったから わざと読みにくいプログラムにしたんじゃね? 書きようによっては何をやっているのか全く分からないプログラムも書けるww それを宿題の答えとして提出させてやろうぜ
int main() { int ar[10]={0}; int max = ar[0], i = 0, end = 10; while(++i < end) ar[i] > max ? max = ar[i] : 0; return 0; }
あーあ
環境依存版 ture==1 環境 int f; f = ar[i] > max; max= ar[i]*f + max*(!f); ture==-1 環境 int f; f = ar[i] > max; max= (ar[i]&f) | (max & (!f));
ほほぉ、trueが-1とな。そんな環境が有り得るのかね。
良く見ろよ tureだぞture 「true」じゃあああああああ無いんだ、 tureだ 真偽値に「ture」なる「何か」を用いる「環境」だ
737 :
デフォルトの名無しさん :2012/05/22(火) 11:36:42.90
Cじゃないんだろ。
N88BASICの PRINT 1=1 は -1 と表示されたな。
お前、書かないほうがいいよ?
で、それに三項演算子があるのかね。
Basic系は-1が出てくるけどさ CPUの比較命令使って出てくるのは0か1であって 1だったら、わざわざ-1にするっていう文が加わってるの?
質問しようと思っていろいろソース見ながら質問文打ってたら間違いがわかった気がして直したら期待通りの動きになった ここにいる人たちのエスパー力凄い ありがとうございました
745 :
デフォルトの名無しさん :2012/05/22(火) 14:46:10.72
どういたしまして。
if(wx < MAX_WX) { wx++; }
>>742 アセンブラ使った事がないのがだだ分かりだな
フラグ知らないだろ
お前がな。 gcc -S でもしてみろ。
751 :
デフォルトの名無しさん :2012/05/22(火) 16:19:00.96
自己紹介乙。
ゼロフラグ、キャリーフラグ。
753 :
デフォルトの名無しさん :2012/05/22(火) 16:21:59.96
配列名にアンパサンドをつけると配列へのポインタが取り出せることがわかりました。 二次元配列を受けるとき、二次元配列は配列へのポインタで受けるということもわかりました。 ただ、二次元配列のアドレスを渡す時、funk()の実引数にアンパサンドをつけないのはどうしてでしょうか。 また、配列名にアンパサンドをつけて渡したあと、受ける側のポインタを操作するとセグメンテーションフォールトになり、コンパイラもエラーを吐きます。 教えてください。よろしくお願いいたします。
754 :
746 :2012/05/22(火) 16:23:15.22
>>747 ありがとうございます、上手くいきました
>>751 「自己紹介乙」とは言うに事欠いて自分の無能をさらけ出すIQ0の言葉ともしらない白痴発見
>>753 配列へのポインタを取り出すには(&)は必要ないよ
というか付けない癖を付けた方がよい
配列変数の修飾別アドレス比較をしてみればいいと思うよ 後は書いてりゃ慣れる
758 :
デフォルトの名無しさん :2012/05/22(火) 16:45:02.96
こりゃあファンキーな質問だ
758 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
>>742 BASICの場合、環境次第で論理演算とビット演算の区別が
文脈依存だったりそもそも無かったりするから
真値の代表は「全ビット1」としてたほうが都合良いんじゃね
762 :
デフォルトの名無しさん :2012/05/22(火) 17:53:49.78
>>753 例えば
void func(char a[][5]);
char a[3][5];
という宣言があった場合、funcを呼ぶときは
func(a);
でよい。
配列名のみは&a[0]と同じ意味になるから、これで型は合っている。
この時の実引数、仮引数の型は char(*)[5]。
上記の宣言で
func(&a);
を渡してしまうと実引数の型はchar(*)[3][5]となってしまう。
警告は出るだろうけど、エラーになるかな?
>>763 それコンパイル通らないっしょ
char(*)[3][5]は3次元配列へのポインタになってしまわないか
じゃなかった、二次元配列へのポインタ、つまり実用上は3次元配列になってしまう
sizeof(&x)してみれ
アンパサンドじゃねーコメだわ・・・
bccとVC++どっちのコンパイラで作ったプログラムのほうが速くて安全っていうのありますか?
>>753 >>763 やっぱ警告は出るけど、エラーにはならないし、実行も問題なさそうです。
どんなコードを書いてますか?
# include <stdio.h>
void func(char a[][5])
{
puts(a[0]);
puts(a[1]);
puts(a[2]);
}
int main (void)
{
char a[3][5] = {
"0123", "4567", "89ab"};
func(a);
puts("===============");
func(&a);
return 0;
}
void func(char (*a)[3][5]) { printf("In func() %p %p %p\n", a[0], a[1], a[2]); } int main(void) { char a[3][5]; printf("In main() %p %p %p\n", a[0], a[1], a[2]); func(&a[0]); return 0; } 例えばこれはコンパイル時警告が出るし(ポインタの非互換)実行結果がおかしい
void func(char (*a)[3][5]) { printf("In func() %p %p %p\n", a[0], a[1], a[2]); } int main(void) { char a[3][3][5]; printf("In main() %p %p %p\n", a[0], a[1], a[2]); func(&a[0]); return 0; } これならちゃんとコンパイルできて実行結果も正しい
>>768 コンパイルされたネイティブに安全も糞もないと思う
実行速度はVCの方が最適化を念入りにするので大抵速いと思うけど
Intel C++ならもっと速くなると思う
いまどきbccって? タダがいいならmingw-gccのほうがいいと思うよ
migwで作ったバイナリってGPL汚染しないの?
しない
>>753 です
void func(int (*p)[3], int (*q)[3], int (*r)[3])
{
int i, j, k;
for (i = 0; i < 3; i++)
for (j = 0; j < 3; j++)
for (k = 0; k < 3; k++)
*(((*r + i)) + j) += *((*(p + k)) + i) * *((*(q + j)) + k);
}
int main(void)
{
int ary1[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
};
int ary2[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
};
int answer[3][3] = {0};
func(ary1, ary2, answer);
return 0;
}
↑こちらは正しく動作します void func(int (*p)[3], int (*q)[3], int (*r)[3]) { int i, j, k; for (i = 0; i < 3; i++) for (j = 0; j < 3; j++) for (k = 0; k < 3; k++) *(((*r + i)) + j) += *((*(p + k)) + i) * *((*(q + j)) + k); } int main(void) { int ary1[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9}, }; int ary2[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9}, }; int answer[3][3] = {0}; func(&ary1, &ary2, &answer); return 0; } 実引数にアンパサンドをつけて渡すと、セグメンテーションフォールトになります。 渡している側と受ける側の型が違うのですか。ありがとうございます。 難しいです。実際に&配列名でどのアドレスが渡っているのか調べてみようと思います。
つまり、実引数に&つけて渡すと、ここでは二次元配列へのポインタを渡すことになってしまうのでしょうか。
> コンパイルされたネイティブに安全も糞もないと思う なんでやねん。
>*(((*r + i)) + j)
char *p=s; while((p=strstr(p,b)!=NULL) { printf("位置 %d\n",p-a); p++; ct++; }
全部
コードを貼れば良いってもんじゃないぞ 間違いを理解させないと意味がない
>>782 while(i+bl<strlen(a)){
とか
if(memcmp(a+i,b,bl)==0){
とか
printf("位置 %d\n",i);
など
>>786 何これ、間違い探しならぬ、使えるところ探し?
すみません、最初に言うべきでしたがstrstr関数を使って解く問題です あとポインタはまだ使えません、すみません
>>788 strstr()関数の引き数はポインタなのだけど、それを使えないとなると
strstr()関数を使うのは不可能だなぁ。
そもそも、宿題なら宿題スレへ。
その通りですね、失礼しました
>>780 コンパイラに明らかなバグがあれば危険だろうけどまずそれはないから
ネイティブに安全も糞もないのはBCCであろうとVCであろうと、システムを
破壊するようなプログラムを作って走らせれば同じように危険だから
>>777 違う配列を並べて書いてもメモリ上で連続されてる保証はない
だからセグメンテーション違反が出たんじゃないの
2次元配列として別々にアクセスすればいいと思う
ない。
>>777 (((*r + i)) + j) += *((*(p + k)) + i) * *((*(q + j)) + k);
これじゃないの?
*((*(r + i)) + j) += *((*(p + k)) + i) * *((*(q + j)) + k);
が正しいような
でも
>>792 の理由通り保証はないからね
配列の配列は連続してるに決まってるだろw
>>797 すまん勘違いしてた
別々に定義した配列2つをあわせて使っていると思っていた
800 :
デフォルトの名無しさん :2012/05/23(水) 16:09:22.14
すみません。皆さんのおっしゃる通り、 (((*r + i)) + j) += *((*(p + k)) + i) * *((*(q + j)) + k); これは *((*(r + i)) + j) += *((*(p + k)) + i) * *((*(q + j)) + k); これの間違いでした。 配列名(ここでは配列の配列)に&をつけると、配列の配列を指すポインタを渡すことになり、それを受けるには、配列の配列へのポインタで受けるということがわかりました。 皆さんありがとうございました。
801 :
デフォルトの名無しさん :2012/05/23(水) 16:10:41.60
これで正方行列の積を他の関数にできます。 ありがとうございました。
802 :
デフォルトの名無しさん :2012/05/23(水) 16:18:03.31
>>800 みたいなコードぜったい書きたくないけど、
ここまで酷いと、逆にマクロにして綺麗になりそうな希ガス。
普通に[]で書けばいいだけじゃん
>>803 んじゃあ普通に[]で書いてみてYO!!
r[i][j] += p[k][i] * q[j][k];
806 :
デフォルトの名無しさん :2012/05/23(水) 16:52:48.30
>>802 p[i]は*(p + i)のシンタックスシュガーってこと知ってる?
#define mm(pm,i,j) *((*((pm)+(i))+(j)) mm(r,i,j)+=(mm(p,k,i))*(mm(q,j,k)); かな?
3x3固定なら void func(void *p, void *q, void *r) { int *ip=(int *)p; int *iq=(int *)q; int *ir=(int *)r; *(ir+i*3+j)+=(*(ip+k*3+i))*(*(iq+j*3+k)); でよくね? 可変ならマクロなりなんなり使えば。
>>807 そんなマクロを書くくらいなら、関数にした方がまし。
アセンブラで書こうぜ!
>>772 まじすかIntel C++ちょっと欲しいですね
趣味でCやってますけどいくらするのか価格が出てないな・・・
問い合わせてみますか
*argvがAAAとして filename = *argv; で、AAA になります。 これを、AAA.txt って表示させたいときにどうやって書けばいいですか? filename = *argv".txt"; で駄目でした。
printf("%s.txt", *argv)
strcat なんてどうだろう
815 :
デフォルトの名無しさん :2012/05/23(水) 19:44:43.50
argvはコマンドライン引数? それだったら始めからAAA.txtを引数にプログラム起動じゃダメかな。 C言語の文字列の結合はそんな簡単にはいかないよ。
char *argv[];
ありがとうございます。 一番簡単そうだったstrcatfで出来ました。 他は難しそう・・・
Cの標準ライブラリって全部覚えないとダメですか?
俺は日本語の辞書にある言葉すべて覚えているわけではないが、会話はできる しかし、単語や意味を多く知っていると便利ではある
>>819 プログラミングは覚えることよりツールの1つとして使うことに重点を置いたほうがいいよ
821 :
820 :2012/05/23(水) 20:54:17.01
strcat(*argv, ".txt"); とかやってないだろうな
多くの入門書には正解パタンしか書いてないからね、 ダメな例きわどい例アホな例、そんなのは全部省かれてる コレはやっちゃダメだよ てな話も少ない
5.1.2.2.1 Program startup 2.? The parameters argc and argv and the strings pointed to by the argv array shall be modifiable by the program, and retain their last-stored values between program startup and program termination. あれ?argvっていじって良かったんだっけ?
>>826 shall be modifiable by the program,
変えることができるようになってなければならないみたいだ。
the argv array shall be modifiable by the program これって起動したプログラムによって設定されるって意味だよね? JISには「プログラムによって変更可能でなければならない」とあるけど 自分でいじるって意味じゃないと思う どうせきっちり文字列が収まる量しか確保されてないだろうし ポインタのポインタでしょ?argcをいじったらどこを指しているポインタ が入っているか分かったもんじゃない だから undefined behavior だと思うんだけどそれが規格票に明言されて いる場所をどうしても見つける事が出来なかった
>>812 int main(int argc, char *argv[])
{
char buf[256];
if (argc) {
sprintf(buf, "%s.txt", argv[0]);
puts(buf);
}
return 0;
}
コピーしてからいじるしかない
ちなみに
strcpy(argv[0], "refjrmedkimgfjgjrfjgrgjorjgore");
ってやったら
Error 00001. 0x130410 (Thread 0x0410): Access overrun: Attempt to access 31 byte(s) at 0x00B978F8, that is at heap block 0x00B978F8 which is only 29 bytes long. intr_strcpy(0x004020CF ["refjrmedkimgfjgjrfjgrgjorjgore"], 0x00B978F8) | argv1.c line 26: | } | |> strcpy(argv[0], "refjrmedkimgfjgjrfjgrgjorjgore"); | | return 0; Call Tree: 0x004011F1(=argv1.exe:0x01:0001F1) argv1.c#26 0x32C9C8CA(=CC32120MT.DLL:0x01:09B8CA) The memory block (0x00B978F8) [size: 29 bytes] was allocated with malloc Call Tree: 0x32C72BB9(=CC32120MT.DLL:0x01:071BB9) 0x32C99B12(=CC32120MT.DLL:0x01:098B12) 0x32C9C843(=CC32120MT.DLL:0x01:09B843) 処理系によると思うけど少なくとも一つの処理系ではargvの変更は駄目でした
書いてないからこそ未定義じゃろ
じゃ「書き換え可能」だけど「最初にセットされた文字列長の範囲内で書き直す事」 とここまで規格票に書くべきだよね(´・ω・`)
あと「argcは最初にセットされた値から0まで小さく書き換え可能だけど大きくした 場合の動作は未定義」とちゃんと明示して欲しかった 何かの理由で書けなかったんだろうか?
いや、フツー書き換えないだろ
>>835 そうなんだが規格票では「書き換え可能」と書いてあるから悩んでるんだよね
>>831 のリンク先も見てみた?Linuxでは意味のある事らしいけど
837 :
デフォルトの名無しさん :2012/05/24(木) 10:59:37.38
すみません。ANSI Cの規格が書かれた書籍が欲しいのですが、手に入るでしょうか。 調べた限りC99の規格の本が出てきたので、もうANSI Cの規格は手に入らないのかと・・・
書き換え可能でも書き換えたくないし、書き換えてるソースは見たくない。
だな そういう事にしとこう
でも
>>517 あたりで白昼堂々と書きかえるソースが出ているという現実、
もしかすると同じ人間かもしれないし
書き変えたい一派があなたの隣にウジャウジャいるのかも知れない
まぁ、細かいことは規格スレでやればいいよ。
Unix系ならargvを書き換える必要性が分からなくもない Windowsで試しにargv[0]を書き換えてみたけどプロセス名は変わらなかった プロセス隠ぺいならもっと高度な方法使うし
843 :
デフォルトの名無しさん :2012/05/24(木) 12:44:31.24
現在のCコンパイラ・PCともfloatよりdouble似最適化されているため、doubleの方が速いというのは本当ですか? 私はintが最速だと思っていたのですが、doubleはintより速いんですか?
floatはdoubleに変換してまたfloatに戻したりするからできればdoubleで intとdoubleは専門分野が違うので比較する事にあまり意味はない
>>843 環境によって全く異なるから意味ないよ
例えば代表的なx86+FPUのCコンパイラならfldでdword ptrからFPUにロードする時
強制的に80bitになり全ての演算も80bitで行われる
そしてfstする時またdword ptr(4バイト)に戻される
他のハードウェアでは32bit精度で行う
細かいことは気にするな ハゲるぞ
>>845 こらこら、大嘘を書くでない。
>>843 一般的に、intの方がdoubleより速いことは期待できるしintで済むならintにするべき。
floatとdoubleではfloatの方が速いことを期待できる場合もある。
しかしfloatとdoubleの関係はshortとintの関係と同じで自動格上げが働くことがあるので、
float演算で処理速度を期待する場合は注意深くコードを書く必要がある。
また、intの計算とdoubleの計算が混ざると型変換でかなり遅くなるから、演算途中の
型変換は極力起きないようにするべき。
従って、整数で済むときで大きさが問題にならないならintを使用し、
そうでない場合はdoubleを使うと思っていれば大抵問題にはならない。
一般的にとか、環境によって異なるを肯定してるじゃん
>>847 > 一般的に
> 期待できるし
> 期待できる場合もある
> 働くことがある
> 極力起きないように
> 大抵
なんだこれはボロボロじゃねーかwww
つまり、初心者は何かの計算するにはintとdoubleだけ使ってろってことだろ。 で、できるだけ混ぜるなっと。
構造体って配列を含んだ変数を入れられますか? struct { x,y,aaa[4] } みたいにやりたいんですが
あなたの目の前のもしもしにはコンパイラさえ入っていないのですか?
>>852 寧ろあんたの目の前の電話にはコンパイラが入っているのか? それはそれですげぇな。
ありがとうございます!外出中なので助かりました!
856 :
デフォルトの名無しさん :2012/05/24(木) 20:22:01.88
20年くらい前の家庭用PCだと for(i=0;i<=1000;i++) { for(j=0;j<=1000;j++) { for(k=0;k<=1000;k++)max=i*k*j; } } のルーチンは何秒くらいで実行可能ですか?
最適化されると0秒だな。
>>847 わかりました。解決しました。
ありがとうございました。
844,845さんもありがとうございました
>>854 俺のスマフォにはコンパイラ入ってますが
電話にコンパイラ入れてない人が何の用があってこのスレにいるの?
普通PCだろ。
>862 近所の泥ママ(チョン)の息子
LIBPNGで画像の色数が256色以下の時に透明色が設定されているかどうかって どうやって取得出来るん? LIBPNGを使ってPNG画像のデコードをしたいんだけど、 画像にα値(透明色含む)が含まれていない場合はメモリの無駄だから、 αデータ分のメモリ領域を確保したくないんだけど フルカラーの場合は png_get_IHDR(pPng, pInfo, &PngWidth, &PngHeight, &bpp, &ColorType, NULL, NULL, NULL); で取得できるColorType,内にPNG_COLOR_MASK_ALPHAビットが立っているか否かで判断できるんだけど 256色以下だとうまく出来ないみたい。 どなたか教えて下さいまし。
WindowsとLinuxで同じコードを書くならやっぱりWindowsでもbccを使ったほうがいいですか? VC++のコンパイラは使うのやめたほうがいいですか?
gcc使え
>>868 gccな、bccじゃボーランド製のコンパイラ…
gcc統一のほうが楽で手堅いだろうけど
両方使ってプリプロセサとか駆使して
両対応のコード書くのも一度くらいは試して欲しいかな
細かい違いをハッキリ認識できると思う
標準の範囲内のI/O(標準入出力とfopen系)しかしないならどれ使っても同じ GUIとかするならWindowsとLinuxで同じコードなんて諦めるが吉
872 :
デフォルトの名無しさん :2012/05/25(金) 17:34:30.21
rand()でランダム値出したら、いつも同じ値になるんですがどうしたらいいですか? 23 425 2 109 2回目も 23 435 . .
srand(time(NULL));を一回だけ呼ぶ
874 :
デフォルトの名無しさん :2012/05/25(金) 17:53:12.63
なるほど gccというものも使ってみたいと思います 将来的にはどうなるか考えてないのですがどっちも経験し対と思います
16bitアクセスしかできない外部メモリへのメモリコピー用にこんな関数を作った。 void memcpyExtRam(uint8_t * dest, const uint8_t * src, unsigned len) { uint16_t * lDest = (uint16_t *) dest; const uint16_t * lSrc = (const uint16_t *) src; len /= 2; for (int ic = 0; ic < len; ++ic) { lDest[ic] = lSrc[ic]; } } gccで-Wcast-alignをつけると警告が出るのだけれど、警告を出さないように指示された。 出すな言われても、キャストするしかないしどうしたもんかの。 あー、お察しの通り組み込み系なんで、標準関数は使えないと言うことで。
C99ならunion使えば規格合致 6.5.2.3
引数の dest は unit16_t* のままじゃないと、 関数外のコードで 16bit 境界外のアクセスを許容しちゃうような気がしないでもない
>>879 どっち途使う側が気をつけないとlenも奇数じゃダメだしな。
881 :
デフォルトの名無しさん :2012/05/26(土) 04:21:59.57
>>881 system("iconv -f cp932 -t utf-8 < cp932.txt > utf8.txt");
883 :
881 :2012/05/26(土) 06:41:01.01
>>882 なんで?
iconvのライブラリの使い方を調べるのに時間を掛ける位なら、シェル経由で動かす方が余程建設的だよ。
って、まさか>882からファイル名固定だとか思い込んじゃってる?
886 :
881 :2012/05/26(土) 13:02:09.28
>>884 ありがとうございました。
>>885 現状がほぼこれに近い状態です。(gnuのlibiconvを利用)
ここからglibc組み込みのgconvへと置き換えたい考えです。
いえいえ
>>843 SIMD使うならfloatの方が倍速い
>>890 その場合、floatとdoubleの変換が起きないように注意。
>>888 libiconvの使い方を云々するぐらいなら、という条件だからねぇ。
どうすりゃ変換が起きるのか教えてくれれば満点なのにな ツメが甘い甘いw
えー、例えばこんな感じ。 float foo = 3; float bar; bar = foo / 2.0; こう書いてしまうと2.0がdoubleなのでfooをdoubleにキャストしてから割り算が行なわれて、 更にfloatにキャストしてからbarに格納されることになる。 ついでに回避策がないから減点なんて言われるとイヤだから付け加えておくと、 bar = foo / 2.0f; と書けばいいことになる。 その他にも例えばbar = sin(foo)とするとdoubleにキャストしてから関数を呼んで戻ってからまたキャストする。 c99ならsinf()を使えばいいけれど、c90でfloatだけで書くのは意外に難しかったりする。 しかもあれだ、プロトタイプ宣言していない場合はfloatを渡すととんでもないことになるね。
894 :
デフォルトの名無しさん :2012/05/26(土) 23:35:13.02
本当に初歩的な質問なのですが int i,sum = 0,avg; これってiに0という値を代入して、sumにavgを代入するって意味ですか?
そうだよ
知らなかった・・・
一つ賢くなったな
お前らwww
ちゃんと入門させてやれよw
900 :
デフォルトの名無しさん :2012/05/26(土) 23:54:44.02
嘘・・・なんですかね?本当の事を教えてほしいのですが
int i; int sum = 0; int avg; を一行で書いただけ
おいおいこの期に及んでまだそんな話を教えるのかよwww
avgの方はcharじゃないの?
i=0; sum=char avg;
0からavgまでの和をiに入れる
この一行にすごく濃い内容が秘められている
そういう悪乗りはVIPでやってろ
結局もしこのスレだけ見てても正解がどれかわからんだろうな
やってみりゃわかるんだから問題は無いわ
C#プログラマじゃ全く想像出来ないんだけどさ、 C言語はCPU依存のコード書けるの? ◯◯命令対応のプログラムなら速いとかあるじゃん? CPUの型番に応じて分岐したりするの?
>>911 組み込みならCPU依存は普通だが、個人向けレベルのPCでは極一部。
インラインアセンブラ使いまくったり インラインアセンブラ使いまくったライブラリを作ってそれを呼び出せばなんでもあり C言語+SSEとかで検索してみ
>>914 PCのOSは元々、「ハードの違いによる個別対応を減らす」ためのもの。
そういうPCで敢えてCPU依存コードを書く意味が有る様なケースは、必然的にハイスキルが必要だから。
存在価値を否定してる訳ではないよ。
>>911 書けるけど、コンパイラにやらせたほうが上手くやってくれるだろうなあ
ありがとう、何となく分かった気がする。 そういうのって大事な基礎だよね いつか挑戦してみるよ
今やれよ
C言語初心者です 5つの整数の値をscanfで読みこんでポーカーの役を表示させるようなプログラムを組めと言われました 例えば5つとも同じなら5カード、5つの内4つ同じなら4カードのようにして フルハウス、3カード、2ペア、1ペアを別々に表示するにはどうすればいいのでしょうか? if文で全通り入力するやり方はしたのですがこれをswitch文で書くようにいわれましたが調べても全然わかりませんでした よろしくお願いします
ggrks
どういう調べ方したのか 何を試したか どこでつまづいてるか 最低限これくらいは書け 標準的な知性があれば調べてわからんなんてことがありえないレベルの話だ
5カード この一言で全て悟った 「コイツはマジモンのアホだ」と それとは別に 役判定は面倒臭い ポーカーは入門クラス、 麻雀がプロクラスの面倒くさささ 初心者ならワンペアでつまづくのは当たり前 たぶんフルハウスあたりで挫折する
>>922 根拠の無い自信に満ちている点だけはうらやましいが
レスの内容からものすごく残念な頭なのが分かる
お花畑の見本として優秀である
WindowsでC99に対応したコンパイラって何を使えばいいでしょうか? VC++はC99に準拠してないってググって分かりました gccも対応してないって知りました
>>919 #include <stdio.h>
#include <stdlib.h>
typedef struct{ int value, count; }card_t;
int card_cmp(const void *a, const void *b){
if(((const card_t*)a)->count>((const card_t*)b)->count) return -1;
return ((const card_t*)a)->count<((const card_t*)b)->count;
}
int main(void){
card_t card[5];
int value, kind=0, i, j, eval=0;
for(i=0;i<5 && scanf("%d", &value)==1;i++){
for(j=0;j<kind;j++){
if(card[j].value==value){
card[j].count++;
break;
}
}
if(j>=kind) card[kind].value=value, card[kind++].count=1;
}
qsort(card, kind, sizeof(card_t), card_cmp);
for(i=0;i<kind;i++) eval=eval*10+card[i].count;
switch(eval){
case 5: puts("5カード"); break;
case 41: puts("4カード"); break;
case 32: puts("フルハウス"); break;
case 311: puts("3カード"); break;
case 221: puts("2ペア"); break;
case 2111: puts("1ペア"); break;
}
return 0;
}
フラッシュに対応しようとして硬直するんですね。わかります。
switch をどうやって使うかだけの問題
おなかが空いたのですが、どうしたらいいですか?
一般的とは言いがたいが、 主に科学技術計算で用いられるようなコンパイラだと PGI C/C++が完全準拠。Intel C/C++もまあまあだったはず
C99の演算系<math.h>にPC/ATでは対応出来ない物が含まれていたと 聞いたことがあります メインストリームならそういう風に設計出来るんでしょうけど まあx86の問題が大きいな
932 :
デフォルトの名無しさん :2012/05/28(月) 03:06:28.54
なんと間抜けな。 まぁ珍しくもないが。
933 :
デフォルトの名無しさん :2012/05/28(月) 11:41:00.97
lintを使わずにgccで配列境界の検査をするオプションってある? int x[10]; x[10]=3; で実行時にエラー吐くような。
あるよ
935 :
934 :2012/05/28(月) 13:30:53.30
あいや。-fbounds-checkで出来るかと思ったらだめだった
936 :
デフォルトの名無しさん :2012/05/28(月) 13:41:24.43
c言語初心者です 1より大きい任意整数値を入力し、入力値より小さい素数を全て列記するプログラムを繰返し文を用いてつくりなさい。 試したすべての数で割り切れない場合は素数ひとつでも割り切れたら素数ではないと判断 任意整数値を入力し、素因数分解するプログラムを繰返し文を作りなさい。 という二つの問題をおしえてください
宿題は宿題スレへ
素因数分解のアルゴリズムか きれいな方法が思い浮かばない できんのかこれ
なんのために素数を求めるのか。
お礼まだ?
>>936 #include <stdio.h>
int main(){
int n, x = 2;
printf("input = ");
scanf("%d", &n);
while (n > 1) {
while (n % x == 0) {
n /= x;
if (n % x)
printf("%d ", x);
}
x++;
}
return 0;
}
942 :
デフォルトの名無しさん :2012/05/28(月) 17:46:03.68
944 :
デフォルトの名無しさん :2012/05/28(月) 18:00:21.72
Microsoft Windows SDK for Windows 7 and .NET Framework 4 x64版の 64bit版のC/C++コンパイラ (Microsoft (R) C/C++ Optimizing Compiler Version 16.00.30319.01 for x64)で mallocを使う場合に、きちんとstdlib.hを読み込まないで2GBを超えたメモリを確保すると 返値のアドレスが下位32bitを符号拡張して64bitにした値になる模様 きちんと#include <stdlib.h>でstdlib.hを読み込むとこの現象は起きないで 正常な64bitのアドレス値を返してくる 何でなんだろうか
スレ違い
>>945 おめーがバカだからだよ
指定が無ければ int ってのは常識
こんなプログラムを作って実行すると正常に動作するが 2行目の#include <stdlib.h>を削除するとおかしな動作になる #include <stdio.h> #include <stdlib.h> #define MEMORY01 250LL*1024LL*1024LL #define MEMORY_N 24 int main( int argc, char **argv){ char *p1[MEMORY_N]; int i, j; for (i = 0; i < MEMORY_N; i++) { p1[i] = (char *) malloc(MEMORY01); if (p1[i] == NULL) { for (j = i - 1; j >= 0; j--) { free(p1[j]); } printf("p1[%d] メモリが確保できません\n", i); exit(1); } } printf("メモリが確保できました\n");
for (i = 0; i < MEMORY_N; i++) { printf("p1[%d] = %016llx\n", i, p1[i]); } printf("\n\n"); printf("確保したメモリに0を書き込み中です\n"); for (i = 0; i < MEMORY_N; i++) { memset(p1[i], 0, MEMORY01); } printf("書き込みが終了しました\n\n"); for (i = 0; i < MEMORY_N; i++) { free(p1[i]); } return(0); }
951 :
919 :2012/05/28(月) 19:47:41.47
952 :
デフォルトの名無しさん :2012/05/29(火) 00:11:16.33
年齢と性別を入力しどのグループに属すか表示するプログラムで聞きたいんですけど グループは4つあり、性別は、男性は0、女性は1で表す。 ※if文のネストを使用する Aは20歳未満男性 Bは20歳未満女性 Cは20歳以上男性 Dは20歳以上女性のやりかたがわからないです。
日本語かけ
>>952 ちょっと簡単あるいは適当にコードを書いてみてください。もしかすると足しになることが書けるかもしれません。
scanf("%d", &s); scanf("%d", &a); if(s == 0) { if(a < 20) printf("A"); else printf("C"); } else { if(a < 20) printf("B"); else printf("D"); }
scanf("%d",&sex); //性別入力 scanf("%d",&age); //年齢入力 if(sex == 0) { if(age >= 20) { printf("C : 男性 20歳以上"); else printf("A : 男性 20歳未満"); } else if(age >= 20) { printf("D : 女性 20歳以上"); else printf("B : 女性 20歳未満"); } }
男か女かをifして普通に20歳判定でいいじゃん なんでそんなに悩むのよ
if文のネストを使ってみる苦行なんだよ 目的的な作業なんだ、 だからいかにバカらしく見えようともアホっぽいif文のネストを描かなきゃあいけないんだ
>>952 #include <stdio.h>
int main(){
int sex, age,w;
char s[] = "ABCD", *tSex[] = {"男性", "女性"}, *tAge[] = {"未満", "以上"};
scanf("%d", &sex);
scanf("%d", &age);
w=(sex)+2*(age>=20);
printf("%c : %s 20歳%s¥n",s[w],tSex[w%2],tAge[w/2]);
return 0;
}
scanf("%d", &s); scanf("%d", &a); switch(s+(a<20 ? 0:2)) { case 0 : /*以下面倒なので省略*/ };
>960 ※if文のネストを使用する
if(sex == 0) { if(age > 12) { printf("えーマジ童貞?\n童貞が許されるのは小学生までだよね\nキャハハハハハハ\n"); } }
【英BBC調査】「世界に良い影響与えている国」 評価は58%で日本がトップ ★低評価の嫌われ者の国ランキング 1位 イラン ←核 2位 パキスタン ←核 3位 北朝鮮 ←核その他 4位 イスラエル ←ユダヤその他 5位 ロシア ←元共産、プーチン 6位 韓国 ←つまり政治的問題とか関係無く、純粋に民族としてクズだから嫌われてるってことw マジで韓国猿は生きてる価値ゼロだろwwww地球の汚物だから一匹残らず死滅した方がイイwwwwwwww 嫌われ者民族の汚物朝鮮猿に生まれたことが死ぬほど恥ずかしいニダ・・・orz
>>963 1位の上に論外国があるはずなのだが、わざと抜いているのか?
論外:アメリカ←核・ユダヤ人/イスラエル支援・実は世界最大のテロ国家・真珠湾2402人の仕返しに広島長崎30万無差別虐殺の100倍返し
グローバル化ってただの植民地政策だよな
967 :
デフォルトの名無しさん :2012/05/29(火) 18:26:43.04
いえいえ
969 :
デフォルトの名無しさん :2012/05/29(火) 19:40:01.06
zlibのgzseekでfseekでのSET_ENDに相当する処理はどう書けば良いでしょうか
>>969 zconf.hに
#if !defined(SEEK_SET) && !defined(Z_SOLO)
# define SEEK_SET 0 /* Seek from beginning of file. */
# define SEEK_CUR 1 /* Seek from current position. */
# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
#endif
って書いてあるじゃん
971 :
デフォルトの名無しさん :2012/05/29(火) 21:01:22.66
残念ながらSEEK_ENDの定義は有るけど実装はないんです。
へぇ そりゃあ…… 難儀なことだ
ENDにseekできたとして何かできるの?