কাঠামো ঘোষণার শেষে এর [1] এর উদ্দেশ্য কী?


96

আমি আমার এমএসপি ৪৩০ মাইক্রোকন্ট্রোলারের হেডার ফাইলগুলি স্নুপ করছিলাম এবং আমি এতে প্রবেশ করলাম <setjmp.h>:

/* r3 does not have to be saved */
typedef struct
{
    uint32_t __j_pc; /* return address */
    uint32_t __j_sp; /* r1 stack pointer */
    uint32_t __j_sr; /* r2 status register */
    uint32_t __j_r4;
    uint32_t __j_r5;
    uint32_t __j_r6;
    uint32_t __j_r7;
    uint32_t __j_r8;
    uint32_t __j_r9;
    uint32_t __j_r10;
    uint32_t __j_r11;
} jmp_buf[1]; /* size = 20 bytes */

আমি বুঝতে পারি যে এটি একটি বেনামি স্ট্রাক্ট ঘোষণা করে এবং এটি টাইপয়েফ এর কাছে jmp_buf, তবে আমি কীসের [1]জন্য তা বুঝতে পারি না । আমি জানি এটি jmp_bufএক সদস্যের সাথে এই অ্যারে হিসাবে ঘোষিত হয়েছে (এই বেনামে স্ট্রাক্টের), তবে আমি কী ভাবতে পারি না এটি কী ব্যবহার করে। কোন ধারনা?


4
পয়েন্টার মধ্যে ক্ষয় সঙ্গে কিছু করতে পারে?
এলাজার

4
চূড়ান্ত মন্তব্যটি পুরোপুরি ভুল বলে মনে হচ্ছে ...
আর .. গিটিহাব থামিয়ে দিচ্ছে সহায়তা আইসিসি

উত্তর:


117

এটি সিতে একটি "রেফারেন্স টাইপ" তৈরি করার একটি সাধারণ কৌশল, যেখানে এটি একটি ফাংশন আর্গুমেন্ট হিসাবে ব্যবহার করার ফলে একক উপাদান অ্যারেটিকে তার পয়েন্টারে প্রথম বিন্দুতে কমিয়ে দেয় প্রোগ্রামার ছাড়াই &অপারেটরটির স্পষ্টভাবে তার ঠিকানা পেতে প্রয়োজন হয় না । যেখানে ঘোষণা করা হয়েছে, এটি একটি সত্য স্ট্যাকের ধরণের (কোনও গতিশীল বরাদ্দ প্রয়োজন নেই), তবে যুক্তি হিসাবে পাস করার পরে, ডাকা ফাংশনটি এটির একটি পয়েন্টার পায়, একটি অনুলিপি নয়, তাই এটি সস্তাভাবে পাস করা হয় (এবং যদি না বলা হয় তবে ফাংশনটি পরিবর্তিত হতে পারে) const)।

জিএমপি তার mpz_tধরণের সাথে একই কৌশল ব্যবহার করে এবং এটি সেখানে সমালোচনামূলক, কারণ কাঠামোটি গতিশীলভাবে বরাদ্দকৃত মেমরির জন্য একটি পয়েন্টার পরিচালনা করে; mpz_initফাংশন এটি একটি কপি গঠন করার জন্য একটি পয়েন্টার পেয়ে, উপর নির্ভর করে, অথবা এটি এ সব এটা শুরু করা যায়নি। একইভাবে, অনেক ক্রিয়াকলাপ গতিশীল বরাদ্দ মেমরির আকার দিতে পারে, এবং যদি তারা কলারের কাঠামোটিকে পরিবর্তন করতে না পারে তবে তা কাজ করবে না।


12
এটি মাধ্যমে অনুলিপি প্রতিরোধ করে =
মেলপোমেন

11
এটা স্থূল। ন্যূনতম সময় ব্যয় হয়ে গেলে আমি এই উত্তরটি গ্রহণ করব। আপনার সাহায্যের জন্য ধন্যবাদ!
আলেকজান্ডার - মনিকা পুনরায়

4
@ আলেকজান্ডার: এটির মতো এনক্যাপুলেটেড হওয়ার পরে এটি মোটামুটি গুরুতর নয় typedef। হ্যাঁ, এই অ্যাডহকটি করা কিছুটা ভয়াবহ হতে পারে তবে আপনার যদি অস্বচ্ছভাবে অস্বচ্ছ ধরণের ধাঁধা থাকে, যেখানে এপিআই ব্যবহারকারী কখনই রেফারেন্স বনাম অ-রেফারেন্স শব্দার্থ (এটি সর্বদা রেফারেন্স দিয়ে পাস করা উচিত ) নিয়ে ভাবার দরকার হয় না , এটি একটি যুক্তিসঙ্গত উপায় অন্যথায় এর অভাব রয়েছে এমন কোনও ভাষাতে স্বয়ংক্রিয় রেফারেন্স শব্দার্থ যুক্ত করার। এমনকি ব্যবহারকারী যদি তাদের নিজস্ব এপিআইগুলি লিখেন যা প্রকারটি গ্রহণ করে, কারণ সিতে, আপনাকে কোনও অ্যারেটিকে আর্গুমেন্ট হিসাবে স্বীকার করার ঘোষণা দেওয়ার অর্থ হ'ল আপনি পয়েন্টার গ্রহণ করেছেন; সবকিছু "শুধু কাজ করে"।
শ্যাডোর্যাঞ্জার

4
@ শ্যাডোএ্যাঞ্জার এটি একটি চতুর কৌশল, তবে ... otherwise lacks itএটি কী স্থূল। সি এর সীমাবদ্ধতাগুলি নিজেই কাজ করে না
আলেকজান্ডার - মনিকা

34
আইএমও এটি স্থূল। জিএমপির সাথে প্রথমবার কাজ করার সময় আমি বুঝতে পারছিলাম না যে এটি কীভাবে কাজ করেছিল কারণ সংখ্যাটি আপাতভাবে মান দিয়ে গেছে। এটিকে ধাঁধা দেওয়ার জন্য আমাকে জিএমপি শিরোনামগুলি খনন করতে হয়েছিল। এটি কেবলমাত্র তাদের মুখে মুখে উড়ে যায় যারা প্রকৃতপক্ষে সি কে ইতিমধ্যে জানে। তারপরে আপনাকে কোন প্যারামিটারগুলি মান দ্বারা পাস হয় এবং কোনটি *কোডের সন্ধানের পরিবর্তে রেফারেন্স হিসাবে মানসিক ট্র্যাক রাখতে হবে ।
এমএম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.